參考文章
nginx和php之間是怎樣通信的呢瓶摆?
編譯PHP并與Ngnix整合
想更加了解可以看下這兩篇內(nèi)容
首先我們先來了解一下整一個的工作流程:
瀏覽器發(fā)送http請求給服務(wù)器nginx上瘟芝,nginx將這個請求轉(zhuǎn)發(fā)給fast-cgi模塊,fast-cgi去與php-fpm通信亥鸠,php-fpm調(diào)用php解析器解析,將解析結(jié)果原路返回直到瀏覽器上识啦,最終瀏覽器解析內(nèi)容渲染
簡要的解釋下其中的要點:
- fast-cgi
FastCGI是一個運用于Http Server和動態(tài)腳本語言間通信的接口负蚊,多數(shù)流行的Http Server都支持FastCGI,包括Apache颓哮、Nginx和lighttpd等家妆。同時,F(xiàn)astCGI也被許多腳本語言支持冕茅,其中就有PHP伤极。
FastCGI接口方式采用C/S結(jié)構(gòu)蛹找,可以將HttP服務(wù)器和腳本解析服務(wù)器分開,同時在腳本解析服務(wù)器上啟動一個或者多個腳本解析守護進程哨坪。
當HttP服務(wù)器每次遇到動態(tài)程序時庸疾,可以將其直接交付給FastCGI進程來執(zhí)行,然后將得到的結(jié)果返回給客戶端当编。這種方式可以讓HttP服務(wù)器專一地處理靜態(tài)請求或者將動態(tài)腳本服務(wù)器的結(jié)果返回給客戶端彼硫,這在很大程度上提高了整個應(yīng)用系統(tǒng)的性能。
在linux上fast-cgi是一個socket凌箕,文件socket或者ip的socket
- php-fpm
PHP-FPM是一個PHP FastCGI進程管理器拧篮,是只用于PHP的,可以在 http://php-fpm.org/download下載得到
PHP-FPM其實是PHP源代碼的一個補丁,旨在將FastCGI進程管理整合進PHP包中牵舱。必須將它patch到你的PHP源代碼中串绩,在編譯安裝PHP后才可以使用
php5.3以后,php-fpm被集成到php的core中芜壁,默認安裝礁凡,無須配置。
細化其中的工作原理
關(guān)鍵在于nginx和php這一塊的通信流程和運行
Nginx不支持對外部程序的直接調(diào)用或者解析慧妄,所有的外部程序(包括PHP)必須通過FastCGI接口來調(diào)用顷牌。FastCGI接口在Linux下是socket(這個socket可以是文件socket,也可以是ip socket)塞淹。
wrapper: 為了調(diào)用CGI程序窟蓝,還需要一個FastCGI的wrapper(wrapper可以理解為用于啟動另一個程序的程序),這個wrapper綁定在某個固定socket上饱普,如端口或者文件socket运挫。
當Nginx將CGI請求發(fā)送給這個socket的時候,通過FastCGI接口套耕,wrapper接收到請求谁帕,然后Fork(派生)出一個新的線程,這個線程調(diào)用解釋器或者外部程序處理腳本并讀取返回數(shù)據(jù)冯袍;
接著匈挖,wrapper再將返回的數(shù)據(jù)通過FastCGI接口,沿著固定的socket傳遞給Nginx康愤;
最后儡循,Nginx將返回的數(shù)據(jù)(html頁面或者圖片)發(fā)送給客戶端。這就是Nginx+FastCGI的整個運作過程翘瓮,
所以贮折,我們首先需要一個wrapper,這個wrapper需要完成的工作:
通過調(diào)用fastcgi(庫)的函數(shù)通過socket和ningx通信(讀寫socket是fastcgi內(nèi)部實現(xiàn)的功能资盅,對wrapper是非透明的)
調(diào)度thread调榄,進行fork和kill
和application(php)進行通信