php.exe和php-win.exe和php-cgi.exe的區別

來源:互聯網
上載者:User
PHP 的命令列模式

從版本 4.3.0 開始,PHP 提供了一種新類型的 SAPI(Server Application Programming Interface,服務端應用編程連接埠)支援,名為 CLI,意為 Command Line Interface,即命令列介面。顧名思義,該 SAPI 模組主要用作 PHP 的開發外殼應用。CLI SAPI 和其它 SAPI模組相比有很多的不同之處,我們將在本章中詳細闡述。值得一提的是,CLI 和 CGI 是不同的 SAPI,儘管它們之間有很多共同的行為。

CLI SAPI 最先是隨 PHP 4.2.0 版本發布的,但仍舊只是一個實驗性的版本,並需要在運行./configure 時加上 --enable-cli 參數。從 PHP 4.3.0 版本開始,CLI SAPI 成為了正式模組,--enable-cli 參數會被預設得設定為 on,也可以用參數 --disable-cli 來屏蔽。

從 PHP 4.3.0開始,CLI/CGI 二進位執行檔案的檔案名稱、位置和是否存在會根據 PHP 在系統上的安裝而不同。在預設情況下,當運行 make 時,CGI 和 CLI 都會被編譯並且分別放置在 PHP 源檔案目錄的 sapi/cgi/php 和 sapi/cli/php 下。可以注意到兩個檔案都被命名為了 php。在 make install 的過程中會發生什麼取決於配置行。如果在配置的時候選擇了一個 SAPI 模組,如 apxs,或者使用了 --disable-cgi 參數,則在 make install 的過程中,CLI 將被拷貝到 {PREFIX}/bin/php,除非 CGI 已經被放置在了那個位置。因此,例如,如果在配置行中有 --with--apxs ,則在 make install 的過程中,CLI 將被拷貝到{PREFIX}/bin/php。如果希望撤銷 CGI 執行檔案的安裝,請在 make install 之後運行 make install-cli。或者,也可以在配置行中加上 --disable-cgi 參數。

Note:

由於 --enable-cli 和 --enable-cgi 同時預設有效,因此,不必再配置行中加上 --enable-cli 來使得 CLI 在 make install 過程中被拷貝到 {PREFIX}/bin/php。

在 PHP 4.2.0 到 PHP 4.2.3 之間的 Windows 發行包中,CLI 的檔案名稱為 php-cli.exe,相同檔案夾下的 php.exe 為 CGI。從 PHP 4.3.0 版本開始,Windows 的發行包中 CLI 的執行檔案為 php.exe,被放置在一個單獨的名為 cli 的檔案夾下,即 cli/php.exe。在 PHP 5 中,CLI 存在於主資料夾中,名為 php.exe,而 CGI 版本名為 php-cgi.exe。

從 PHP 5 起,一個名為 php-win.exe 的新檔案隨包發布。它相當於 CLI 版本,但是 php-win 不輸出任何內容,便不提供控制台(不會彈出“DOS 視窗”)。這種方式類似於 php-gtk。需要使用 --enable-cli-win32 選項來配置它。

Note: 如何得知自己使用的是哪個 SAPI。

在命令列下,運行 php -v 便能得知該 php 是 CGI 還是 CLI。請參考函數php_sapi_name() 以及常量 PHP_SAPI。

Note:

在 PHP 4.3.2 中加入了 Unix 的 man 頁面。可以在命令列中鍵入 man php 來查看。

以下為 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(包含有實際參數的數組)。

對於 PHP 4.3.0,在使用 CLI SAPI 時,PHP 變數$argc 和 $argv 已被註冊並且設定了對應的值。而在這之前的版本,這兩個變數在 CGI 或者 模組 版本中的建立依賴於將 PHP 的設定選項 register_globals 設為 on。除了版本和register_globals 設定以外,可以隨時通過調用 $_SERVER 或者 $HTTP_SERVER_VARS 來訪問它們。例如:$_SERVER['argv']

Note:

這些設定無法在設定檔案 php.ini 或任何指定的其它檔案中被初始化為其它值。這些預設值被限制在所有其它的設定檔案被解析後改變。不過,它們的值可以在程式啟動並執行過程中被改變(儘管對於該運行過程來說,這些設定項是沒有意義的)。

為了減輕外殼環境下的工作,我們定義了如下常量:

CLI 專用常量
常量名稱 描 述
STDIN 一個已開啟的指向 stdin 的流。可以用如下方法來調用: <?php

$stdin = fopen('php://stdin', 'r');

?> 如果想從 stdin 讀取一行內容,可以使用 <?php
$line = trim(fgets(STDIN)); // 從 STDIN 讀取一行
fscanf(STDIN, "%d ", $number); // 從 STDIN 讀取數字
?>
STDOUT 一個已開啟的指向 stdout 的流。可以用如下方式來調用: <?php

$stdout = fopen('php://stdout', 'w');

?>
STDERR 一個已開啟的指向 stderr 的流。可以用如下方式來調用: <?php

$stderr = fopen('php://stderr', 'w');

?>

有了以上常量,就無需自己建立指向諸如 stderr 的流,只需簡單的使用這些常量來代替流指向:

php -r 'fwrite(STDERR, "stderr");'
無需自己來關閉這些流,PHP 會自動完成這些操作。

CLI SAPI 不會將目前的目錄改為已啟動並執行指令碼所在的目錄。

以下範例顯示了本模組與 CGI SAPI 模組之間的不同: <?php
// 名為 test.php 的簡單測試程式
echo getcwd(), " ";
?>

在使用 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
這使得在利用 PHP 編寫外殼工具時獲得了很大的便利。

Note:

可以在命令列運行時給該 CGI SAPI 加上 -C 參數,使其支援 CLI SAPI 的功能。

以下是 PHP 二進位檔案(即 php.exe 程式)提供的命令列模式的選項參數,隨時可以運行帶-h 參數的 PHP 命令來查詢這些參數。

Usage: php [options] [-f] <file> [--] [args...]       php [options] -r <code> [--] [args...]       php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...]       php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...]       php [options] -- [args...]       php [options] -a  -a               Run interactively  -c <path>|<file> Look for php.ini file in this directory  -n               No php.ini file will be used  -d foo[=bar]     Define INI entry foo with value 'bar'  -e               Generate extended information for debugger/profiler  -f <file>        Parse <file>.  -h               This help  -i               PHP information  -l               Syntax check only (lint)  -m               Show compiled in modules  -r <code>        Run PHP <code> without using script tags <?..?>  -B <begin_code>  Run PHP <begin_code> before processing input lines  -R <code>        Run PHP <code> for every input line  -F <file>        Parse and execute <file> for every input line  -E <end_code>    Run PHP <end_code> after processing all input lines  -H               Hide any passed arguments from external tools.  -s               Display colour syntax highlighted source.  -v               Version number  -w               Display source with stripped comments and whitespace.  -z <file>        Load Zend extension <file>.  args...          Arguments passed to script. Use -- args when first argument                   starts with - or script is read from stdin

CLI SAPI 模組有以下三種不同的方法來擷取要啟動並執行 PHP 代碼:

讓 PHP 運行指定檔案。

php my_script.phpphp -f my_sc

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.