CLI SAPI 有三種不同的方法執行 PHP 代碼:
讓 PHP 運行指定文件。
$ php my_script.php $ php -f my_script.php
以上兩種方法(使用或不使用 -f 參數)都能夠運行給定的
my_script.php 文件。注意,沒(méi)有限制可以執行哪種文件,
特別是文件名也不必用 .php
作為擴展名。
在命令行中直接傳遞 PHP 代碼執行。
$ php -r 'print_r(get_defined_constants());'
必須特別注意 shell 變量的替代及引號的使用。
注意:
請仔細閱讀以上范例,它們沒(méi)有開(kāi)始和結束標識符!加上 -r 參數后不需要這些標記符,并且加上它們還會(huì )導致語(yǔ)法錯誤。
通過(guò)標準輸入(stdin
)提供需要運行的 PHP 代碼。
這為動(dòng)態(tài)創(chuàng )建 PHP 代碼并通過(guò)二進(jìn)制文件執行提供了強大的能力,就像下面(虛構的)例子展示的一樣:
$ some_application | some_filter | php | sort -u > final_output.txt
和所有的 shell 應用程序一樣,PHP 的二進(jìn)制文件及其 PHP 腳本能夠接受一系列的參數。PHP
沒(méi)有限制傳送給腳本的參數的個(gè)數( shell 對傳遞的字符數有限制,但通常都不會(huì )超過(guò)該限制)。傳遞給腳本的參數可在全局數組
$argv 中獲取。第一個(gè)索引(零)始終包含從命令行中調用的腳本名稱(chēng)。注意在命令行內使用 -r
執行 PHP 代碼時(shí), $argv[0] 的值將是 "Standard input code"
;
在 PHP 7.2.0 之前是破折號(-
)。如果代碼是通過(guò)來(lái)自 STDIN
的管道執行的,同樣如此。
另外,第二個(gè)全局變量 $argc 包含 $argv 數組中元素的個(gè)數(而不是傳遞給腳本的參數個(gè)數)。
只要傳送給腳本的參數不是以 -
字符開(kāi)頭,就無(wú)需過(guò)多的注意什么。向腳本傳遞以
-
開(kāi)頭的參數會(huì )導致錯誤,因為 PHP
會(huì )認為在執行腳本之前應該由它自身來(lái)處理這些參數。為防止發(fā)生這種情況,可以用列表分隔符
--
參數來(lái)解決。在 PHP 解析此分隔符之后,
該符號后的所有參數將會(huì )被原樣傳遞給腳本程序。
# 以下命令將不會(huì )運行 PHP 代碼,而只顯示 PHP 命令行模式的使用說(shuō)明 $ php -r 'var_dump($argv);' -h Usage: php [options] [-f] <file> [args...] [...] # 將會(huì )傳遞 “-h” 參數傳送給腳本,且 PHP 不會(huì )顯示命令行模式的使用說(shuō)明 $ php -r 'var_dump($argv);' -- -h array(2) { [0]=> string(1) "-" [1]=> string(2) "-h" }
然而,在 Unix 系統中還有一個(gè)將 PHP 用于 shell 腳本的方法:寫(xiě)個(gè)腳本,第一行以 #!/usr/bin/php
為開(kāi)頭
(如果 PHP CLI 二進(jìn)制文件路徑不一樣,則可以指定為任意實(shí)際的路徑)。文件的剩余部分應該包含通用的 PHP 開(kāi)始標簽、正常的
PHP 代碼、PHP 結束標簽。一旦設置正確的文件執行屬性(例如 chmod +x test),腳本就像其他
shell/perl 腳本一樣可以執行。
示例 #1 PHP 腳本作為 shell 腳本執行
#!/usr/bin/php
<?php
var_dump($argv);
?>
假設在當前目錄下,該文件名為 test,可以做如下操作:
$ chmod +x test $ ./test -h -- foo array(4) { [0]=> string(6) "./test" [1]=> string(2) "-h" [2]=> string(2) "--" [3]=> string(3) "foo" }
正如看到的,在向該腳本傳遞以 -
開(kāi)頭的參數時(shí),無(wú)需關(guān)心這種情況。
PHP 可執行文件可用于運行完全獨立于 web 服務(wù)器的 PHP 腳本。在 Unix 系統上,需要在 PHP 腳本的第一行指定
#!
(或者說(shuō) “shebang”)以便系統可以自動(dòng)判斷用哪個(gè)程序運行腳本。
在 Windows 平臺上可以使用雙擊擴展名是.php
的文件與 php.exe
相關(guān)聯(lián),也可以編寫(xiě)一個(gè)批處理文件使用 PHP 運行腳本。為 Unix 系統增加的指定 shebang 的第一行代碼不會(huì )影響 Windows (它也是 PHP
注釋的格式),因此也可以用該方法編寫(xiě)跨平臺的程序。以下是編寫(xiě)的一個(gè)簡(jiǎn)單
PHP 命令行程序的示例。
示例 #2 試圖以命令行方式運行的 PHP 腳本(script.php)
#!/usr/bin/php
<?php
if ($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];
}
?>
在以上腳本中,用包含 Unix shebang 的第一行代碼來(lái)指明該文件應該由 PHP 來(lái)執行。這里使用 CLI 版本運行,因此不會(huì )輸出 HTTP 頭。
程序首先檢查是否有需要的參數(除了腳本名,因為它也會(huì )被計算進(jìn)來(lái))。如果沒(méi)有參數或者參數是 --help、 -help、 -h、 -?,將會(huì )打印出幫助消息, 在命令行上使用 $argv[0] 動(dòng)態(tài)輸出腳本名稱(chēng)。否則參數將按照接收的方式進(jìn)行準確回顯。
如果在 Unix 下運行以上腳本,它必須有可執行權限,并簡(jiǎn)單的以 script.php echothis 或者 script.php -h 方式調用。在 Windows 下,可以為此類(lèi)任務(wù)編寫(xiě)與以下內容類(lèi)似的批處理文件:
示例 #3 運行 PHP 命令行腳本的批處理文件(script.bat)
@echo OFF "C:\php\php.exe" script.php %*
假設將上述程序名為 script.php,且 CLI 版的 php.exe 位于 C:\php\php.exe, 該批處理文件將會(huì )運行并傳遞所有追加選項: script.bat echothis 或者 script.bat -h。
參閱 Readline 擴展文檔獲取更多函數,以用于 PHP 中增強命令行應用程序。
在 Windows 上, PHP 可以配置為無(wú)需提供 C:\php\php.exe 或者
擴展名為 .php
的文件運行,如
PHP 在 Microsoft Windows 下的命令行方式中所述。
注意:
在 Windows 上,推薦在真實(shí)用戶(hù)賬戶(hù)下運行 PHP。在網(wǎng)絡(luò )服務(wù)下運行某些操作時(shí)將會(huì )失敗, 因為“帳戶(hù)名與安全標識間無(wú)任何映射完成”。