1、CGI(通用網關接口/Common Gateway Interface)一般是可執行程序,例如EXE文件,和WEB服務器各自占據着不同的進程,而且一般一個CGI程序只能處理一個用戶請求。這樣,當用 戶請求數量非常多時,會大量占用系統的資源,如內存、CPU時間等,造成效能低下。
2、ISAPI(Internet Server Application Program Interface)是微軟提供的一套面向WEB服務的API接口,它能實現CGI提供的全部功能,並在此基礎上進行了擴展,如提供了過濾器應用程序接 口。ISAPI應用大多數以DLL動態庫的形式使用,可以在被用戶請求后執行,,在處理完一個用戶請求后不會馬上消失,而是繼續駐留在內存中等待處理別的 用戶輸入。此外,ISAPI的DLL應用程序和WEB服務器處於同一個進程中,效率要顯著高於CGI。
3、FastCGI是可伸縮架構的CGI開放擴展,其主要行為是將CGI解釋器進程保持在內存中並因此獲得較高的性能。傳統的CGI解釋器的反復加載是 CGI性能低下的主要原因,如果CGI解釋器保持在內存中並接受FastCGI進程管理器調度,則可以提供良好的性能、伸縮性等。
以 ISAPI 模式運行 PHP 的,這種方式最大的缺點就是穩定性不好,當 PHP 出錯的時候,Apache進程也死掉。
FastCGI 模式運行 PHP 的優點:
首先就是 PHP 出錯的時候不會搞垮 Apache,只是 PHP 自己的進程當掉(但 FastCGI 會立即重新啟動一個新 PHP 進程來代替當掉的進程)。
其次 FastCGI 模式運行 PHP 比 ISAPI 模式性能更好
最后,就是可以同時運行 PHP5 和 PHP4
FastCGI 模式的一些缺點:
用 FastCGI 模式更適合生產環境的服務器,但對於開發用機器來說就不太合適。因為當使用 Zend Studio 調試程序時,由於 FastCGI 會認為 PHP 進程超時,從而在頁面返回 500 錯誤。
從版本 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 參數。
以下為 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 中的某些設置,因為這些設置在外殼環境下是沒有意義的。