Php與Apache的三種結合方式以及各自優缺點
httpd與php的結合方式:
如果網站的訪問量很小,同一時間僅僅處理單個請求,那麼各種結合方式的特點並不能很好的體現。這裡我們僅考慮在高訪問量、高併發情況下各種結合方式的優缺點。
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類執行緒,較好的解決了這個問題。
比較:
以CGI方式執行PHP,由於CGI是非常駐記憶體集,每次Webserver接受客戶端的HTTP請求,然後建立程序執行CGI程式,客戶端的請求被傳遞給CGI程式,CGI執行後結果再返回Webserver。 每次瀏覽頁面都要重複上面的動作,會有非常大的消耗。
以mod_php模式執行PHP,意味著php是作為apache的一個模組來啟動的,因此只有在apache啟動的時候會載入擴充套件模組,在apache執行期間是不會再去讀取和載入擴充套件模組的。顯然使用mod_php的方式執行PHP效率比CGI方式更高。
而mod_php與fastcgi相比,倆者都有程序池的概念,但是,fastcgi將伺服器端動、靜態請求更好的分離。php程序除了問題不會將web伺服器也當掉。
最後再對幾個名詞進行解釋:
php的直譯器是php-cgi。php-cgi只是個CGI程式,只能解析請求,返回結果,不會程序管理,而php-fastcgi是php-cgi的升級版。php-fpm的功能就是能夠排程php解釋程序實現程序管理。