1.php簡單介紹
php,超文本預(yù)處理語言,超文本可以聯(lián)想到html,可以解釋php也是一門web端語言,當然php當今主要用法也是用在web上。 預(yù)處理顧名思義,提前處理的意思,我的理解是我們執(zhí)行html文件時只要通過瀏覽器打開,瀏覽器會實時渲染代碼。當執(zhí)行php文件時,我們需要先通過web服務(wù)器轉(zhuǎn)發(fā)給php解釋器處理返回html代碼,php解釋器會執(zhí)行嵌入在php文件中的php代碼,這樣返回給瀏覽器渲染的代碼其實已經(jīng)提前處理過了。
2.php web請求運行流程
說起php web不得不提起web服務(wù)器,與php結(jié)合比較緊密的服務(wù)器主要有兩種,nginx與apache,區(qū)別可自行百度。
在介紹流程之前需要先介紹幾個概念:
-
sapi
php對外通信接口。
由于php不能直接處理http請求,所以它定義了一組接口與web服務(wù)器進行通信,這組接口有幾種,比較常見的是cgi/fastcgi,apache2 handler,cli,打開phpinfo可以看見配置的是哪種
cgi/fastcgi
apache2 handler cgi
cgi叫網(wǎng)關(guān)通信協(xié)議,他是一種協(xié)議,介于web服務(wù)器與cgi程序之間,它規(guī)定了web服務(wù)器該把數(shù)據(jù)以怎樣的數(shù)據(jù)結(jié)構(gòu)傳給cgi程序,然后cgi程序處理完代碼之后該以怎樣的數(shù)據(jù)結(jié)構(gòu)把數(shù)據(jù)回傳給web服務(wù)器。php-cgi
php的cgi程序,可以通過php的實現(xiàn)了cgi協(xié)議的cgi/fastcgi接口接受數(shù)據(jù)處理,不過cgi有個很坑的地方,每次web請求都會啟動一次cgi程序然后再退出,這樣對大規(guī)模并發(fā)并不友好。fastcgi
為了優(yōu)化以上問題,所以引出了fastcgi,fastcgi可以看成cgi協(xié)議的升級版,它事先早早啟動多個cgi程序,等待web請求,處理完了之后也不會退出,等待下一個請求。php-fpm
實現(xiàn)了fastcgi的php進程管理器,php-fpm啟動時有三種模式,即靜態(tài),動態(tài),按需。我們一般用的是動態(tài),在php-fpm啟動時預(yù)先啟動一個主進程和20個子進程(可配置),請求空閑或請求繁忙是會自動kill或fork一個子進程,但不能高于配置好的最大子進程數(shù)與最小子進程數(shù)。主進程負責分發(fā)(其實子進程會競爭)web請求給子進程,同時解析配置文件,初始化執(zhí)行環(huán)境,對子進程進行管理,而子進程只負責處理,至于什么時候退出處理狀態(tài),什么時候kill,均交給主進程。php-fpm通常與nginx一起配合使用。-
apache處理php web程序
apache一般是將php作為自己單獨的模塊去進行處理,php5.x有php5_module模塊,php7.x有php7_module,apache通過這些模塊與php通信,這種模式每次請求apache都會產(chǎn)生一條進程,關(guān)鍵apache還是同步阻塞的,請求需要等著處理返回結(jié)果,這樣一旦達到進程的最大數(shù),那下面的請求就需要排隊,這就造成了大規(guī)模并發(fā)的問題。
apache處理 -
nginx處理php web程序
nginx一般和php-fpm配合起來用,準確來說是配合實現(xiàn)fastcgi的程序來使用,拿php-fpm來說,它本身實現(xiàn)了動態(tài)管理進程,已經(jīng)節(jié)省了資源,而nginx又是異步非阻塞的,請求無需等待返回子進程就可以接受處理新的請求,再加上可以通過fastcgi_pass轉(zhuǎn)發(fā)請求給其他的web服務(wù)器減少壓力,從而能承受較大并發(fā)。
nginx處理



