作 php 開發的應該都知道 php 運行模式概念吧,本文將要和你們分享的是關於php目前比較常見的五大運行模式:包括cgi 、fast-cgi、cli、isapi、apache模塊的DLL ,下面做者就這五大運行模式作一些本身的分析,有不對的地方,還請留言指正。php
CGI運行模式linux
CGI即通用網關接口(Common Gateway Interface),它是一段程序,通俗的講CGI就象是一座橋,把網頁和WEB服務器中的執行程序鏈接起來,它把HTML接收的指令傳遞給服務器的執行程序,再把服務器執行程序的結果返還給HTML頁。CGI 的跨平臺性能極佳,幾乎能夠在任何操做系統上實現。數據庫
CGI方式在遇到鏈接請求(用戶 請求)先要建立cgi的子進程,激活一個CGI進程,而後處理請求,處理完後結束這個子進程。這就是fork-and-execute模式。因此用cgi方式的服務器有多少鏈接請求就會有多少cgi子進程,子進程反覆加載是cgi性能低下的主要緣由。都會當用戶請求數量很是多時,會大量擠佔系統的資源如內 存,CPU時間等,形成效能低下。apache
Fast-CGI運行模式windows
fast-cgi 是cgi的升級版本,FastCGI像是一個常駐(long-live)型的CGI,它能夠一直執行着,只要激活後,不會每次都要花費時間去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全稱PHP FastCGI進程管理器進行管理。api
FastCGI的工做原理瀏覽器
一、Web Server啓動時載入FastCGI進程管理器(IIS ISAPI或Apache Module)服務器
二、FastCGI進程管理器自身初始化,啓動多個CGI解釋器進程(可見多個php-cgi)並等待來自Web Server的鏈接。數據結構
三、當客戶端請求到達Web Server時,FastCGI進程管理器選擇並鏈接到一個CGI解釋器。Web server將CGI環境變量和標準輸入發送到FastCGI子進程php-cgi。模塊化
四、 FastCGI子進程完成處理後將標準輸出和錯誤信息從同一鏈接返回Web Server。當FastCGI子進程關閉鏈接時,請求便告處理完成。FastCGI子進程接着等待並處理來自FastCGI進程管理器(運行在Web Server中)的下一個鏈接。 在CGI模式中,php-cgi在此便退出了。
在上述狀況中,你能夠想象CGI一般有多慢。每個Web請求PHP都必須從新解析php.ini、從新載入所有擴展並重初始化所有數據結構。使用FastCGI,全部這些都只在進程啓動時發生一次。一個額外的 好處是,持續數據庫鏈接(Persistent database connection)能夠工做。
cli運行模式
cli是php的命令行運行模式,你們常常會使用它,可是可能並無注意到(例如:咱們在linux下常用 「php -m」查找PHP安裝了那些擴展就是PHP命令行運行模式;有興趣的同窗能夠輸入php -h去深刻研究該運行模式)
ISAPI運行模式
ISAPI即Internet Server Application Program Interface,是微軟提供的一套面向Internet服務的API接口,一個ISAPI的DLL,能夠在被用戶請求激活後長駐內存,等待用戶的另外一個請求,還能夠在一個DLL裏設置多個用戶請求處理函數,此外,ISAPI的DLL應用程序和WWW服務器處於同一個進程中,效率要顯著高於CGI。(因爲微軟的排他性,只能運行於windows環境)
APACHE2HANDLER
PHP做爲Apache模塊,Apache服務器在系統啓動後,預先生成多個進程副本駐留在內存中,一旦有請求出現,就當即使用這些空餘的子進程進行處理,這樣就不存在生成子進程形成的延遲了。這些服務器副本在處理完一次HTTP請求以後並不當即退出,而是停留在計算機中等待下次請求。對於客戶瀏覽器的請求反應更快,性能較高。
apache模塊的DLL運行模式
此運行模式是咱們之前在windows環境下使用apache服務器常用的,而在模塊化(DLL)中,PHP是與Web服務器一塊兒啓動並運行的。(是apache在CGI的基礎上進行的一種擴展,加快PHP的運行效率)
對於以上每種運行模式都有本身的優缺點,沒有絕對的好與壞,主要是看你們在什麼環境下面有什麼樣的需求了。