2024 年日本 PHP 研討會

與其他 SAPI 的差異

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 環境中沒有意義。

    被覆蓋的 php.ini 指令
    指令 CLI SAPI 預設值 註解
    html_errors false 預設為 false,因為在 shell 環境中,當錯誤訊息夾雜著未解譯的 HTML 標籤時,閱讀起來相當困難。
    implicit_flush true 在 shell 環境中,通常希望輸出(例如來自 printecho 等)立即顯示,而不是保留在緩衝區中。儘管如此,仍然可以使用 輸出緩衝 來延遲或操作標準輸出。
    max_execution_time 0(無限制) Shell 環境中的 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()

  • 為了簡化在 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 參數。

新增註解

使用者貢獻的註解

此頁面沒有使用者貢獻的註解。
To Top