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