一、CGI(通用網關接口/Common Gateway Interface)通常是可執行程序,例如EXE文件,和WEB服務器各自佔據着不一樣的進程,並且通常一個CGI程序只能處理一個用戶請求。這樣,當用 戶請求數量很是多時,會大量佔用系統的資源,如內存、CPU時間等,形成效能低下。
二、ISAPI(Internet Server Application Program Interface)是微軟提供的一套面向WEB服務的API接口,它能實現CGI提供的所有功能,並在此基礎上進行了擴展,如提供了過濾器應用程序接 口。ISAPI應用大多數以DLL動態庫的形式使用,能夠在被用戶請求後執行,,在處理完一個用戶請求後不會立刻消失,而是繼續駐留在內存中等待處理別的 用戶輸入。此外,ISAPI的DLL應用程序和WEB服務器處於同一個進程中,效率要顯著高於CGI。
三、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 中的某些設置,由於這些設置在外殼環境下是沒有意義的。