首頁  >  文章  >  後端開發  >  PHP下的命令列執行

PHP下的命令列執行

不言
不言原創
2018-05-09 11:56:331939瀏覽

這篇文章主要介紹了關於PHP下的命令列執行,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

以下是 PHP  二進位檔案(即 php.exe 程式)提供的命令列模式的選項參數,您隨時可以透過 PHP -h 指令來查詢這些參數。

Usage: php [options] [-f] <file> [args...]
       php [options] -r <code> [args...]
       php [options] [-- args...]
  -s               Display colour syntax highlighted source.
  -w               Display source with stripped comments and whitespace.
  -f <file>        Parse <file>.
  -v               Version number
  -c <path>|<file> Look for php.ini file in this directory
  -a               Run interactively
  -d foo[=bar]     Define INI entry foo with value &#39;bar&#39;
  -e               Generate extended information for debugger/profiler
  -z <file>        Load Zend extension <file>.
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -i               PHP information
  -r <code>        Run PHP <code> without using script tags <?..?>
  -h               This help
 
  args...          Arguments passed to script. Use -- args when first argument 
                   starts with - or script is read from stdin

CLI SAPI 模組有以下三種不同的方法來取得您要執行的 PHP 代碼:

在windows環境下,盡量使用雙引號, 在linux環境下則盡量使用單引號來完成。

  1. 讓 PHP 執行指定檔案。

    php my_script.php 
    php -f  "my_script.php"

    #以上兩種方法(使用或不使用 -f 參數)都能夠運行給定的 my_script.php 檔案。您可以選擇任何檔案來執行,您指定的 PHP 腳本並非必須以 .php 為副檔名,它們可以有任意的檔案名稱和副檔名。

  2. 在命令列直接執行 PHP 程式碼。

    php -r "print_r(get_defined_constants());"

    #在使用此方法時,請您注意外殼變數的替代及引號的使用。


  1. #: 請仔細閱讀上述範例,在執行程式碼時沒有開始和結束的標記符!加上 -r 參數後,這些標記子是不需要的,加上它們會導致文法錯誤。

  2. 透過標準輸入(stdin)提供需要執行的 PHP 程式碼。

    以上用法為我們提供了非常強大的功能,讓我們可以如下範例所示,動態地產生 PHP 程式碼並透過命令列執行這些程式碼:

    $ some_application | some_filter | php | sort -u >final_output.txt
    #

以上三种运行代码的方法不能同时使用。

和所有的外壳应用程序一样,PHP 的二进制文件(php.exe 文件)及其运行的 PHP 脚本能够接受一系列的参数。PHP 没有限制传送给脚本程序的参数的个数(外壳程序对命令行的字符数有限制,但您通常都不会超过该限制)。传递给您脚本的参数可在全局变量 $argv 中获取。该数组中下标为零的成员为脚本的名称(当 PHP 代码来自标准输入获直接用 -r 参数以命令行方式运行时,该名称为“-”)。另外,全局变量 $argc 存有 $argv 数组中成员变量的个数(而非传送给脚本程序的参数的个数)。

只要您传送给您脚本的参数不是以 - 符号开头,您就无需过多的注意什么。向您的脚本传送以 - 开头的参数会导致错误,因为 PHP 会认为应该由它自身来处理这些参数。您可以用参数列表分隔符 -- 来解决这个问题。在 PHP 解析完参数后,该符号后所有的参数将会被原样传送给您的脚本程序。

# 以下命令将不会运行 PHP 代码,而只显示 PHP 命令行模式的使用说明:
$ php -r &#39;var_dump($argv);&#39; -h
Usage: php [options] [-f] <file> [args...]
[...]
 
# 以下命令将会把“-h”参数传送给脚本程序,PHP 不会显示命令行模式的使用说明:
$ php -r "var_dump($argv);" -- -h
array(2) {
  [0]=>
  string(1) "-"
  [1]=>
  string(2) "-h"
}

除此之外,我们还有另一个方法将 PHP 用于外壳脚本。您可以在写一个脚本,并在第一行以 #!/usr/bin/php 开头,在其后加上以 PHP 开始和结尾标记符包含的正常的 PHP 代码,然后为该文件设置正确的运行属性。该方法可以使得该文件能够像外壳脚本或 PERL 脚本一样被直接执行。

#!/usr/bin/php
<?php
    var_dump
($argv);
?>
<span style="color:rgb(0,0,0);"><span style="color:rgb(0,0,187);"></span></span>

假设改文件名为 test 并被放置在当前目录下,我们可以做如下操作:

$ chmod 755 test
$ ./test -h -- foo
array(4) {
  [0]=>
  string(6) "./test"
  [1]=>
  string(2) "-h"
  [2]=>
  string(2) "--"
  [3]=>
  string(3) "foo"
}

如您所看到的,當您傳送以 - 開頭的參數給該腳本時,腳本仍然能夠正常運作。

----------------------------------------- -------------------------------------指令選項----------- ------------------------------------------

表格23-3.命令列選項

## 描述#-s-w-f-v$ php -v PHP 4.3.0-dev (cli), Copyright (c) 1997-2002 The PHP Group Zend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies-c$ php -c /custom/directory/ my_script.php $ php -c /custom/directory/custom-file.ini my_script.php#-a
選項名稱

顯示有語法高亮色彩的原始檔。

此參數使用內建機制來解析檔案並為其產生一個 HTML 高亮版本並將結果寫入標準輸出。請注意該過程所做的只是產生了一個 ffbe95d20f3893062224282accb13e8f [...] 1cd55414ff5abdfea5dd958e7e547fdd 的 HTML 標記符塊,並沒有包含任何的 HTML

 頭。


附註: 此選項不能和 -r

 參數同時使用。


顯示除去了註解和空格的原始碼。


附註: 此選項不能和 -r

 參數同時使用。


#解析並執行給定的檔案名稱。此參數為可選參數且可不加,僅指明需要運行的檔案名稱即可。

將 PHP、PHP SAPI 及 Zend 的版本資訊寫入的標準輸出。例如:

使用該參數,您可以指定一個放置 #php .ini 文件的目錄,或直接指定自訂的 INI 文件,其檔案名稱可不是 php.ini

。例如:

## 互動地執行 PHP。

-d

用此參數可以自行設定 php.ini 檔案中設定變數的值,其語法為:

-d configuration_directive[=value]

範例:

# Ommiting the value part will set the given configuration directive to "1" $ php -d max_execution_time       -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(1) "1" # Passing an empty value part will set the configuration directive to "" php -d max_execution_time=       -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(0) "" # The configuration directive will be set to anything passed after the '=' character $  php -d max_execution_time=20      -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(2) "20" $  php       -d max_execution_time=doesntmakesense       -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(15) "doesntmakesense"
-e

為偵錯器等產生擴充資訊。

-z

載入 Zend 擴充功能庫。如果僅給定一個檔案名,PHP 將試圖從您系統擴充功能庫的預設路徑(在 Linux 系統下,該路徑通常由 /etc/ld.so.conf 指定)載入該擴充功能庫。如果您用一個絕對路徑指定檔案名,則系統的擴充庫預設路徑將不會被使用。如果使用相對路徑指定的檔案名,PHP 則僅試圖載入相對於目前目錄的擴充庫。

-l

此參數提供了對指定 PHP 程式碼進行語法檢查的方便的方法。如果成功,則向標準輸出寫入 No syntax errors detected in 2334ac29606bf8a170583e4f7533b1f4 字串,並且外殼回傳值為 0。如果失敗,則 Errors parsing 2334ac29606bf8a170583e4f7533b1f4 以及內部解析器錯誤訊息會一起寫入標準輸出,同時外殼回傳值將別設為 255

此參數將無法檢查致命錯誤(如未定義函數),如果您希望偵測之名錯誤,請使用 -f 參數。


附註: 此參數不能和 -r 一同使用。


-m

使用此參數,PHP 將列印內建以及已加載的PHP 及Zend 模組:

$ php -m [PHP Modules] xml tokenizer standard session posix pcre overload mysql mbstring ctype [Zend Modules]
-i 此指令列參數會呼叫 phpinfo() 函數,並列印出結果。如果 PHP 沒有正常運作,我們建議您執行 php -i 指令來檢視在資訊表格之前或對應的地方是否有任何錯誤訊息輸出。請注意輸出的內容為 HTML 格式,因此輸出的資訊篇幅較大。
-r

使用此參數可以在命令列執行 PHP 程式碼。您無需加上 PHP 的起始和結束識別碼(1923ada389f70ffdc4bf563d64fd29a5),否則將會導致語法解析錯誤。


註: 使用此形式的 PHP 時,應個別註意避免和外殼環境進行的命令列參數替換相衝突。

顯示語法解析錯誤的範例

$ php -r "$foo = get_defined_constants();" Command line code(1) : Parse error - parse error, unexpected '='

這裡的問題在於即時使用了雙引號 ",sh/bash 仍然實行了參數替換。由於  $foo 沒有被定義,被替換後它所在的位置變成了空字符,因此在運行時,實際被 PHP讀取的代碼為:

$ php -r " = get_defined_constants();"

正確的方法是使用單引號 '。在用單引號引用的字串中,變數不會被sh/bash 還原成其原值。

$ php -r '$foo = get_defined_constants(); var_dump($foo);' array(370) {  ["E_ERROR"]=>  int(1)  ["E_WARNING"]=>  int(2)  ["E_PARSE"]=>  int(4)  ["E_NOTICE"]=>  int(8)  ["E_CORE_ERROR"]=>  [...]

如果您使用的外殼不是 sh/bash,您可能會碰到其它的問題。請回報您碰到的 bug,或寄email到 phpdoc@lists.php.net。

當您試圖將外殼的環境變數引入到馬或用反斜線來轉義字元時也可能碰到各種各樣的問題,請在使用時注意!



#: -r# 在 #CLI SAPI 中有效,在 CGI# SAPI 中無效。


-h 使用該參數,您可以得到完整的命令列參數的清單及這些參數作用的簡單描述。


PHP 的命令列模式能使得 PHP 腳本能完全獨立於 WEB 伺服器單獨運作。如果您使用 Unix 系統,您需要在您的 PHP 腳本的最前面加上一行特殊的程式碼,使得它能夠被執行,這樣系統就能知道用什麼樣的程式要執行該腳本。在 Windows 平台下您可以將 php.exe 和 .php 檔案的雙擊屬性相關聯,您也可以編寫一個批次檔來用 PHP 執行腳本。為 Unix 系統增加的第一行程式碼不會影響該腳本在 Windows 下的執行,因此您也可以用該方法編寫跨平台的腳本程式。以下是一個簡單的PHP 命令列程式的範例。


###### #範例23-1. 試圖以命令列方式執行的PHP 腳本(script.php)# ######!/usr/bin/phpe1fdd9ed62aefc931077bf327a1259b5This is a command line PHP script with one option.  Usage:  863ff2161598d69fe0edd8cb64c2048f be< <can<can<can<); you would like  to print out. With the --help, -help, -h,  or -? options, you can get this help.在上述腳本中,我們用第一行特殊的程式碼來指明該檔案應該由 PHP 來執行。我們在這裡使用 CLI 的版本,因此不會有 HTTP 頭資訊輸出。當您用 PHP 編寫命令列應用程式時,您可以使用兩個參數:$argc 和 $argv。前面一個的值是比參數個數大 1 的整數(運行的腳本本身的名稱也被當作一個參數)。第二個時包含有參數的數組,其第一個元素為腳本的名稱,下標為數字 0($argv[0])。

在上述程式中我們檢查了參數的個數是大於 1 個還是小於 1 個。即時參數是 --help-help-h 或 -?,我們仍然列印出幫助訊息,並同時動態輸出腳本的名稱。如果還收到了其它參數,我們也把它們顯示出來。

如果您希望在Unix 下執行以上腳本,您需要讓它成為可執行腳本,然後簡單的運行 script.php echothis 或 script.php -h。在Windows 下,您可以為此編寫一個批次檔:



#@c:\php\cli\php.exe script.php %1 %2 %3 %4

 


############################### ##

以上是PHP下的命令列執行的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn