和其它 SAPI 模塊的區(qū)別

以下為 CLI SAPI 和其它 SAPI 模塊相比的顯著區(qū)別:

  • CGI SAPI 不同,其輸出沒(méi)有任何頭信息。

    盡管 CGI SAPI 提供了取消 HTTP 頭信息的方法,但在 CLI SAPI 中并不存在類似的方法以開啟 HTTP 頭信息的輸出。

    CLI 默認(rèn)以安靜模式開始,但為了保證兼容性,-q--no-header 參數(shù)為了向后兼容仍然保留,使得可以使用舊的 CGI 腳本。

    在運(yùn)行時(shí),不會(huì)把工作目錄改為腳本的當(dāng)前目錄(可以使用 -C--no-chdir 參數(shù)來(lái)兼容 CGI 模式)。

    出錯(cuò)時(shí)輸出純文本的錯(cuò)誤信息(非 HTML 格式)。

  • CLI SAPI 強(qiáng)制覆蓋了 php.ini 中的某些設(shè)置,因?yàn)檫@些設(shè)置在外殼環(huán)境下是沒(méi)有意義的。

    覆蓋 php.ini 設(shè)置選項(xiàng)
    設(shè)置選項(xiàng) CLI SAPI 默認(rèn)值 備注
    html_errors false 無(wú)意義的 HTML 標(biāo)記符會(huì)使得出錯(cuò)信息很凌亂,所以在外殼下閱讀報(bào)錯(cuò)信息是十分困難的。因此將該選項(xiàng)的默認(rèn)值改為 false。
    implicit_flush true 在命令行模式下,所有來(lái)自 printecho 的輸出將被立即寫到輸出端,而不作任何地緩沖操作。如果希望延緩或控制標(biāo)準(zhǔn)輸出,仍然可以使用 output buffering 設(shè)置項(xiàng)。
    max_execution_time 0(無(wú)限值) 鑒于在外殼環(huán)境下使用 PHP 的無(wú)窮的可能性,最大運(yùn)行時(shí)間被設(shè)置為了無(wú)限值。為 web 開發(fā)的應(yīng)用程序可能只需運(yùn)行幾秒鐘時(shí)間,而外殼應(yīng)用程序的運(yùn)行時(shí)間可能會(huì)長(zhǎng)的多。
    register_argc_argv true

    由于該設(shè)置為 true,將總是可以在 CLI SAPI 中訪問(wèn)到 argc(傳送給應(yīng)用程序參數(shù)的個(gè)數(shù))和 argv(包含有實(shí)際參數(shù)的數(shù)組)。

    在使用 CLI SAPI 時(shí),PHP 變量 $argc$argv 已被注冊(cè)并且設(shè)定了對(duì)應(yīng)的值。隨時(shí)可以通過(guò) $_SERVER 數(shù)組 來(lái)訪問(wèn)它們,例如:$_SERVER['argv']

    output_buffering false

    雖然 php.ini 設(shè)置已經(jīng)硬編碼為 false, 輸出緩沖控制函數(shù)仍然有效。

    max_input_time false

    PHP CLI 不支持 GET、POST、文件上傳。

    注意:

    這些設(shè)置無(wú)法在設(shè)置文件 php.ini 或任何指定的其它文件中被初始化為其它值。這些默認(rèn)值被限制在所有其它的設(shè)置文件被解析后改變。 不過(guò),它們的值可以在程序運(yùn)行的過(guò)程中被改變 (盡管對(duì)于該運(yùn)行過(guò)程來(lái)說(shuō),這些設(shè)置項(xiàng)是沒(méi)有意義的,例如 register_argc_argv)。

    注意:

    推薦命令行腳本設(shè)置 ignore_user_abort。 更多信息參見(jiàn) ignore_user_abort()。

  • 為了減輕外殼環(huán)境下的工作,我們?yōu)?I/O 流 定義了一系列常量。

  • CLI SAPI 不會(huì)將當(dāng)前目錄改為已運(yùn)行的腳本所在的目錄。

    以下范例顯示了本模塊與 CGI SAPI 模塊之間的不同:

    <?php
    // 名為 test.php 的簡(jiǎn)單測(cè)試程序
    echo getcwd(), "\n";
    ?>

    在使用 CGI 版本時(shí),其輸出為

    $ pwd
    /tmp
    
    $ php-cgi -f another_directory/test.php
    /tmp/another_directory
    

    明顯可以看到 PHP 將當(dāng)前目錄改成了剛剛運(yùn)行過(guò)的腳本所在的目錄。

    使用 CLI SAPI 模式,得到:

    $ pwd
    /tmp
    
    $ php -q another_directory/test.php
    /tmp
    
    這使得在利用 PHP 編寫外殼工具時(shí)獲得了很大的便利。

    注意:

    可以在命令行運(yùn)行時(shí)給該 CGI SAPI 加上 -C 參數(shù),使其支持 CLI SAPI 的功能。