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ù)丸冕。主進程負責(zé)分發(fā)(其實子進程會競爭)web
請求給子進程,同時解析配置文件薛窥,初始化執(zhí)行環(huán)境胖烛,對子進程進行管理,而子進程只負責(zé)處理拆檬,至于什么時候退出處理狀態(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處理