本文主要和大家分享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 'bar' -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環境下則盡量使用單引號來完成。
讓 PHP 運行指定檔案。
php my_script.php php -f "my_script.php" |
以上兩種方法(使用或不使用 -f 參數)都能夠運行給定的 my_script.php 檔案。您可以選擇任何檔案來運行,您指定的 PHP 指令碼並非必須要以 .php 為副檔名,它們可以有任意的檔案名稱和副檔名。
在命令列直接運行 PHP 代碼。
php -r "print_r(get_defined_constants());" |
在使用這種方法時,請您注意外殼變數的替代及引號的使用。
注: 請仔細閱讀以上範例,在運行代碼時沒有開始和結束的標記符!加上 -r 參數後,這些標記符是不需要的,加上它們會導致語法錯誤。
通過標準輸入(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 'var_dump($argv);' -hUsage: php [options] [-f] <file> [args...][...] # 以下命令將會把“-h”參數傳送給指令碼程式,PHP 不會顯示命令列模式的使用說明:$ php -r "var_dump($argv);" -- -harray(2) { [0]=> string(1) "-" [1]=> string(2) "-h"} |
除此之外,我們還有另一個方法將 PHP 用於外殼指令碼。您可以在寫一個指令碼,並在第一行以 #!/usr/bin/php 開頭,在其後加上以 PHP 開始和結尾標記符包含的正常的 PHP 代碼,然後為該檔案設定正確的運行屬性。該方法可以使得該檔案能夠像外殼指令碼或 PERL 指令碼一樣被直接執行。
#!/usr/bin/php <?php var_dump($argv); ?> |
假設改檔案名稱為 test 並被放置在目前的目錄下,我們可以做如下操作:
$ chmod 755 test$ ./test -h -- fooarray(4) { [0]=> string(6) "./test" [1]=> string(2) "-h" [2]=> string(2) "--" [3]=> string(3) "foo"} |
正如您所看到的,在您向該指令碼傳送以 - 開頭的參數時,指令碼仍然能夠正常運行。
表格 23-3. 命令列選項
| 選項名稱 |
描 述 |
| -s |
顯示有文法高亮色彩的源檔案。 該參數使用內建機制來解析檔案並為其產生一個 HTML 高亮版本並將結果寫到標準輸出。請注意該過程所做的只是產生了一個 <code> [...] </code> 的 HTML 標籤符塊,並不包含任何的 HTML 頭。
注: 該選項不能和 -r 參數同時使用。
|
| -w |
顯示除去了注釋和空格的原始碼。
注: 該選項不能和 -r 參數同時使用。
|
| -f |
解析並運行給定的檔案名稱。該參數為選擇性參數且可以不加,僅指明需要啟動並執行檔案名稱即可。 |
| -v |
將 PHP、PHP SAPI 及 Zend 的版本資訊寫入的標準輸出。例如: $ php -vPHP 4.3.0-dev (cli), Copyright (c) 1997-2002 The PHP GroupZend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies |
| -c |
用該參數,您可以指定一個放置 php.ini 檔案的目錄,或者直接指定一個自訂的 INI 檔案,其檔案名稱可以不是 php.ini。例如: $ php -c /custom/directory/ my_script.php $ php -c /custom/directory/custom-file.ini my_script.php |
| -a |
互動地運行 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 <filename> 字串,並且外殼傳回值為 0。如果失敗,則 Errors parsing <filename> 以及內部解析器錯誤資訊會一起被寫入到標準輸出,同時外殼傳回值將別設定為 255。 該參數將無法檢查致命錯誤(如未定義函數),如果您希望檢測之名錯誤,請使用 -f 參數。
注: 該參數不能和 -r 一同使用。
|
| -m |
使用該參數,PHP 將列印出內建以及已載入的 PHP 及 Zend 模組: $ php -m[PHP Modules]xmltokenizerstandardsessionposixpcreoverloadmysqlmbstringctype [Zend Modules] |
| -i |
該命令列參數會調用 phpinfo() 函數,並列印出結果。如果 PHP 沒有正常工作,我們建議您執行 php -i 命令來查看在資訊表格之前或者對應的地方是否有任何錯誤資訊輸出。請注意輸出的內容為 HTML 格式,因此輸出的資訊篇幅較大。 |
| -r |
使用該參數可以在命令列運行 PHP 代碼。您無需加上 PHP 的起始和結束標識符(<?php 和 ?>),否則將會導致文法解析錯誤。
注: 使用這種形式的 PHP 時,應個別注意避免和外殼環境進行的命令列參數替換相衝突。
顯示文法解析錯誤的範例 $ php -r "$foo = get_defined_constants();"Command line code(1) : Parse error - parse error, unexpected '='
這裡的問題在於即時使用了雙引號 ",sh/bash 仍然實行了參數替換。由於 $foo 沒有被定義,被替換後它所在的位置變成了Null 字元,因此在運行時,實際被 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,或者發郵件到 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/php<?phpif ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {?>This is a command line PHP script with one option. Usage: <?php echo $argv[0]; ?> <option> <option> can be some word you would like to print out. With the --help, -help, -h, or -? options, you can get this help.<?php} else { echo $argv[1];}?> |
在以上指令碼中,我們用第一行特殊的代碼來指明該檔案應該由 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