CLI SAPI 與其他 SAPI 的顯著差異
與 CGI SAPI 不同,CLI SAPI 不會將標頭寫入輸出。
雖然 CGI SAPI 提供了一種抑制 HTTP 標頭的方法,但在 CLI SAPI 中沒有相對應的開關可以啟用它們。
預設情況下,CLI 以靜默模式啟動,但保留了 -q 和 --no-header 參數以保持相容性,以便可以使用較舊的 CGI 腳本。
它不會將工作目錄更改為腳本所在的目錄。(保留 -C 和 --no-chdir 參數以保持相容性)
純文字錯誤訊息(無 HTML 格式)。
某些 php.ini 指令會被 CLI SAPI 覆蓋,因為它們在 shell 環境中沒有意義。
指令 | CLI SAPI 預設值 | 註解 |
---|---|---|
html_errors | false |
預設為 false ,因為在 shell 環境中,當錯誤訊息夾雜著未解譯的 HTML 標籤時,閱讀起來相當困難。 |
implicit_flush | true |
在 shell 環境中,通常希望輸出(例如來自 print、echo 等)立即顯示,而不是保留在緩衝區中。儘管如此,仍然可以使用 輸出緩衝 來延遲或操作標準輸出。 |
max_execution_time | 0(無限制) | Shell 環境中的 PHP 的用途比典型的基於 Web 的腳本要多得多,而且由於這些腳本可能非常耗時,因此最大執行時間設定為無限制。 |
register_argc_argv | true |
將此設定為 使用 CLI SAPI 時,PHP 變數 $argc 和 $argv 會自動設定為適當的值。這些值也可以在 $_SERVER 陣列中找到,例如:$_SERVER['argv']。 |
output_buffering | false |
|
max_input_time | false |
PHP CLI 不支援 GET、POST 或檔案上傳。 |
注意事項:
這些指令無法透過設定檔 php.ini 或自訂設定檔 (如果指定的話) 中的其他值來初始化。這個限制是因為這些值是在所有設定檔都被解析後才套用的。然而,它們的值可以在執行期間更改(雖然並非所有指令都適用,例如 register_argc_argv)。
注意事項:
建議在命令列腳本中設定 ignore_user_abort。詳情請參閱 ignore_user_abort()。
為了簡化在 shell 環境中的工作,已為 I/O 串流 定義了一些常數。
CLI SAPI 並**不會**將目前目錄更改為執行腳本的目錄。
範例 #1 顯示與 CGI SAPI 的差異
<?php
// 我們簡單的測試應用程式,名為 test.php
echo getcwd(), "\n";
?>
使用 CGI 版本時,輸出為
$ pwd /tmp $ php -q another_directory/test.php /tmp/another_directory
這清楚地表明 PHP 將其目前目錄更改為執行腳本所在的目錄。
使用 CLI SAPI 的結果為
$ pwd /tmp $ php -f another_directory/test.php /tmp
這在使用 PHP 撰寫 shell 工具時提供了更大的彈性。
注意事項:
CGI SAPI 支援此 CLI SAPI 行為,方法是在從命令列執行時使用 -C 參數。