本文主要和大家分享以下是 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);' -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); ?>
假設改文件名為 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
顯示有語法高亮色彩的原始檔。
此參數使用內建機制來解析檔案並為其產生一個 HTML 高亮版本並將結果寫入標準輸出。請注意該過程所做的只是產生了一個 [...]
的 HTML 標記符塊,並不包含任何的 HTML 頭。
附註: 此選項不能和 -r 參數同時使用。
-w
#顯示移除註解和空格的原始碼。
註: 此選項不能和 -r 參數同時使用。
-f
#解析並執行給定的檔案名稱。此參數為可選參數且可不加,僅指明需要運行的檔案名稱即可。
-v
#將 PHP、PHP SAPI 及 Zend 的版本資訊寫入的標準輸出。例如:
$ 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.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 將 set the given configuration directive to "1" $ php -d max_execution_time -r '$foo = ini_get("max_execution_time""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" );' string(0) "" # The configuration directive will be set to anything passed after the '=' character $ php -d max_execution_time=20 -r '$foo = ini_getget("max_exeution_pution_$. ;' string(2) "20" $ php -d max_execution_time=doesntmakesense -r '$foo = ini_get("max_execution_time"); var_dump($foo = ini_get("max_execution_time"); var_dump($foo);' string("max_execution_time"); var_dump($foo);' string(" e
為偵錯器等產生擴充資訊。
-z
#載入 Zend 擴充功能庫。如果僅給定一個檔案名,PHP 將試圖從您系統擴充功能庫的預設路徑(在 Linux 系統下,該路徑通常由 /etc/ld.so.conf 指定)載入該擴充功能庫。如果您用一個絕對路徑指定檔案名,則系統的擴充庫預設路徑將不會被使用。如果使用相對路徑指定的檔案名,PHP 則僅試圖載入相對於目前目錄的擴充庫。
-l
此參數提供了指定 PHP 程式碼進行語法檢查的方便的方法。如果成功,則向標準輸出寫入 No syntax errors detected in
此參數將無法檢查致命錯誤(如未定義函數),如果您希望偵測之名錯誤,請使用 -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 的起始和結束識別碼(),否則將會導致語法解析錯誤。
附註: 使用此形式的 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 還原成原值。 1) ["E_WARNING"]=> int(2) ["E_PARSE"]=> int(4) ["E_NOTICE"]=> int(8) ["E_CORE_ERROR"]=> int(8) ["E_CORE_ERROR"]=> ["E_CORE_ERROR"]= ]
如果您使用的外殼不是sh/bash,您可能會碰到其它的問題。 ##當您試圖將外殼的環境變數引入馬或用反斜線來轉義字元時也可能碰到各種各樣的問題,請在使用時注意! r 在 CLI SAPI 中有效,在 CGI SAPI 中無效。
##PHP 的命令列模式能使PHP 腳本能完全獨立於WEB 伺服器單獨運作。執行,這樣系統就能知道用什麼樣的程式要執行該腳本。 。以下是一個簡單的PHP 命令列程式的範例。 範例23-1. 試圖以命令列方式執行的PHP 腳本(script.php)#!/usr/bin/phpThis is a command line PHP script with one option. Usage: