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