和其它 SAPI 模組的區別
以下為 CLI SAPI 和其它 SAPI 模組相比的顯著區別:
-
與 CGI SAPI 不同,其輸出沒有任何頭資訊。
儘管 CGI SAPI 提供了取消 HTTP 頭資訊的方法,但在 CLI SAPI 中並不存在類似的方法以開啟 HTTP 頭資訊的輸出。
CLI 預設以安靜模式開始,但爲了保證相容性,-q 和 --no-header 參數爲了向後相容仍然保留,使得可以使用舊的 CGI 指令碼。
在執行時,不會把工作目錄改為指令碼的當前目錄(可以使用 -C 和 --no-chdir 參數來相容 CGI 模式)。
出錯時輸出純文字的錯誤資訊(非 HTML 格式)。
-
CLI SAPI 強制覆蓋了 php.ini 中的某些設定,因為這些設定在外殼環境下是沒有意義的。
覆蓋 php.ini 設定選項 設定選項 CLI SAPI 預設值 備註 html_errors false
無意義的 HTML 標記符會使得出錯資訊很凌亂,所以在外殼下閱讀報錯資訊是十分困難的。因此將該選項的預設值改為 false
。implicit_flush true
在命令列模式下,所有來自 print
和echo
的輸出將被立即寫到輸出端,而不作任何地緩衝操作。如果希望延緩或控制標準輸出,仍然可以使用 output buffering 設定項。max_execution_time 0(無限值) 鑑於在外殼環境下使用 PHP 的無窮的可能性,最大執行時間被設定爲了無限值。為 web 開發的應用程式可能只需執行幾秒鐘時間,而外殼應用程式的執行時間可能會長的多。 register_argc_argv true
由於該設定為
true
,將總是可以在 CLI SAPI 中訪問到 argc(傳送給應用程式參數的個數)和 argv(包含有實際參數的陣列)。在使用 CLI SAPI 時,PHP 變數
$argc
和$argv
已被註冊並且設定了對應的值。隨時可以通過 $_SERVER 陣列 來訪問它們,例如:$_SERVER['argv']output_buffering false
雖然 php.ini 設定已經硬編碼為
false
, 輸出緩衝控制函式仍然有效。max_input_time false
PHP CLI 不支援 GET、POST、檔案上傳。
注意:
這些設定無法在設定檔案 php.ini 或任何指定的其它檔案中被初始化為其它值。這些預設值被限制在所有其它的設定檔案被解析后改變。 不過,它們的值可以在程式執行的過程中被改變 (儘管對於該執行過程來說,這些設定項是沒有意義的,例如 register_argc_argv)。
注意:
推薦命令列指令碼設定 ignore_user_abort。 更多資訊參見 ignore_user_abort()。
-
爲了減輕外殼環境下的工作,我們為 I/O 流 定義了一系列常量。
-
CLI SAPI 不會將目前目錄改為已執行的指令碼所在的目錄。
以下範例顯示了本模組與 CGI SAPI 模組之間的不同:
<?php
// 名為 test.php 的簡單測試程式
echo getcwd(), "\n";
?>在使用
CGI
版本時,其輸出為$ pwd /tmp $ php-cgi -f another_directory/test.php /tmp/another_directory
明顯可以看到 PHP 將目前目錄改成了剛剛執行過的指令碼所在的目錄。
使用 CLI SAPI 模式,得到:
$ pwd /tmp $ php -q another_directory/test.php /tmp
注意:
可以在命令列執行時給該 CGI SAPI 加上 -C 參數,使其支援 CLI SAPI 的功能。