一、CGI
CGI(common gateway interface)通常翻譯為共同網關接口,是HTTP伺服器與機器上的其他程式進行通訊的一個接口,讓Web伺服器必要時啟動額外的程式處理動態內容。 CGI是一種協議,它定義了Webserver與CGI程式的通訊方式。 Webserver接受客戶端的HTTP請求,然後建立進程執行CGI程序,客戶端的請求傳遞給CGI程序,CGI執行後結果再回傳Webserver。
CGI的出現讓WEB從靜態變成動態,隨著Web的越來越普及,許多的網站的都需要有動態的頁面,以便與瀏覽者互交。隨著網路技術的發展,CGI方式的缺點也越來越突出。每次客戶端請求都需要建立和銷毀進程。因為HTTP要產生一個動態頁面,系統就必須啟動一個新的進程以運行CGI程序,不斷地fork是一項很消耗時間和資源的工作。
二、FastCGI
眾所周知,CGI解釋器的反覆載入是CGI效能低的主要原因,如果CGI解釋器保持在記憶體中並接受FastCGI進程管理器調度,則可以提供良好的性能、伸縮性、Fail-Over特性等等。
FastCGI是常駐型的CGI,可以一直執行,只要啟動後,不會每次都花時間去fork一次,而且還支援分散式運算(使得php程式解釋執行可以單獨交給php伺服器),即可以在網站伺服器以外的主機上執行並且接受來自其它網站伺服器來的請求。
1、Web Server 啟動時載入FastCGI進程管理器(IIS ISAPI或Apache Module);
2、FastCGI進程管理器本身初始化,啟動多個CGI解釋器進程(在工作管理員中可見多個php-cgi.exe)並等待來自Web Server的連線。
3、當客戶端要求到達Web Server時,FastCGI進程管理器選擇並連線到一個CGI解釋器。 Web server將CGI環境變數和標準輸入傳送到FastCGI子進程php-cgi.exe。
4、FastCGI子進程完成處理後將標準輸出和錯誤訊息從相同連線返回Web Server。當FastCGI子程序關閉連線時,請求便告處理完成。 FastCGI子進程接著等待並處理來自FastCGI進程管理器(運行在 WebServer中)的下一個連線。在正常的CGI模式中,php-cgi.exe在此便退出了。
三、Module
把php編譯成apache的模組,就要考慮apache的MPM的工作模式。
首先我們要了解什麼是MPM:
MPM:Multi Path Modules (多道處理模組)用於定義apache在回應多個使用者請求時所工作的模型。有三種MPM模式:
prefork(一個請求一個行程回應);
worker(一個請求用一個執行緒回應,啟動多個行程每個行程產生多個執行緒);
event(一個進程處理多個請求);
以模組安裝的php沒有獨立的進程,是作為apache的模組和apache一起啟動的。
以上三種MPM模式,worker模式會比prefork模式佔據更少的內存,高並發下的表現更好。而且使用多進程和多線程混合模式,即使有一個線程掛了,也只影響和該線程同進程的其他線程,不會影響到其他的進程。但是如果有特別多的線程都使用keep-alive的長連接方式,則線程會一直被佔據直到超時才釋放,導致在高並發場景下無可用線程。而event模式則使用了一個專門的線程來處理這些keep-alive類別線程,較好的解決了這個問題。
推薦教學:PHP影片教學
#以上是php與apache整合的幾種類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!