?
Ce document utilise Manuel du site Web PHP chinois Libérer
FPM(FastCGI Process Manager)是PHP FastCGI運行模式的一個進(jìn)程管理器,從它的定義可以看出,F(xiàn)PM的核心功能是進(jìn)程管理,那么它用來管理什么進(jìn)程呢?這個問題就需要從FastCGI說起了。
FastCGI是Web服務(wù)器(如:Nginx、Apache)和處理程序之間的一種通信協(xié)議,它是與Http類似的一種應(yīng)用層通信協(xié)議,注意:它只是一種協(xié)議!
前面曾一再強(qiáng)調(diào),PHP只是一個腳本解析器,你可以把它理解為一個普通的函數(shù),輸入是PHP腳本。輸出是執(zhí)行結(jié)果,假如我們想用PHP代替shell,在命令行中執(zhí)行一個文件,那么就可以寫一個程序來嵌入PHP解析器,這就是cli模式,這種模式下PHP就是普通的一個命令工具。接著我們又想:能不能讓PHP處理http請求呢?這時就涉及到了網(wǎng)絡(luò)處理,PHP需要接收請求、解析協(xié)議,然后處理完成返回請求。在網(wǎng)絡(luò)應(yīng)用場景下,PHP并沒有像Golang那樣實現(xiàn)http網(wǎng)絡(luò)庫,而是實現(xiàn)了FastCGI協(xié)議,然后與web服務(wù)器配合實現(xiàn)了http的處理,web服務(wù)器來處理http請求,然后將解析的結(jié)果再通過FastCGI協(xié)議轉(zhuǎn)發(fā)給處理程序,處理程序處理完成后將結(jié)果返回給web服務(wù)器,web服務(wù)器再返回給用戶,如下圖所示。
PHP實現(xiàn)了FastCGI協(xié)議的解析,但是并沒有具體實現(xiàn)網(wǎng)絡(luò)處理,一般的處理模型:多進(jìn)程、多線程,多進(jìn)程模型通常是主進(jìn)程只負(fù)責(zé)管理子進(jìn)程,而基本的網(wǎng)絡(luò)事件由各個子進(jìn)程處理,nginx、fpm就是這種模式;另一種多線程模型與多進(jìn)程類似,只是它是線程粒度,通常會由主線程監(jiān)聽、接收請求,然后交由子線程處理,memcached就是這種模式,有的也是采用多進(jìn)程那種模式:主線程只負(fù)責(zé)管理子線程不處理網(wǎng)絡(luò)事件,各個子線程監(jiān)聽、接收、處理請求,memcached使用udp協(xié)議時采用的是這種模式。