PHP-FPM 即 PHP FastCGI 進(jìn)程管理器,要了解 PHP-FPM ,首先要看看 CGI 與 FastCGI 的關(guān)系。
CGI 的英文全名是 Common Gateway Interface,即通用網(wǎng)關(guān)接口,是 Web 服務(wù)器調(diào)用外部程序時(shí)所使用的一種服務(wù)端應(yīng)用的規(guī)范。
早期的 Web 通信只是按照客戶端請求將保存在 Web 服務(wù)器硬盤中的數(shù)據(jù)轉(zhuǎn)發(fā)過去而已,這種情況下客戶端每次獲取的信息也是同樣的內(nèi)容(即靜態(tài)請求,比如圖片、樣式文件、HTML文檔),而隨著 Web 的發(fā)展,Web 所能呈現(xiàn)的內(nèi)容更加豐富,與用戶的交互日益頻繁,比如博客、論壇、電商網(wǎng)站、社交網(wǎng)絡(luò)等。
這個(gè)時(shí)候僅僅通過靜態(tài)資源已經(jīng)無法滿足 Web 通信的需求,所以引入 CGI 以便客戶端請求能夠觸發(fā) Web 服務(wù)器運(yùn)行另一個(gè)外部程序,客戶端所輸入的數(shù)據(jù)也會(huì)傳給這個(gè)外部程序,該程序運(yùn)行結(jié)束后會(huì)將生成的 HTML 和其他數(shù)據(jù)通過 Web 服務(wù)器再返回給客戶端(即動(dòng)態(tài)請求,比如基于 PHP、Python、Java 實(shí)現(xiàn)的應(yīng)用)。利用 CGI 可以針對用戶請求動(dòng)態(tài)返回給客戶端各種各樣動(dòng)態(tài)變化的信息。
FastCGI 顧名思義,是 CGI 的升級版本,為了提升 CGI 的性能而生,CGI 針對每個(gè) HTTP 請求都會(huì) fork 一個(gè)新進(jìn)程來進(jìn)行處理(解析配置文件、初始化執(zhí)行環(huán)境、處理請求),然后把這個(gè)進(jìn)程處理完的結(jié)果通過 Web 服務(wù)器轉(zhuǎn)發(fā)給用戶,剛剛 fork 的新進(jìn)程也隨之退出,如果下次用戶再請求動(dòng)態(tài)資源,那么 Web 服務(wù)器又再次 fork 一個(gè)新進(jìn)程,如此周而復(fù)始循環(huán)往復(fù)。
而 FastCGI 則會(huì)先 fork 一個(gè) master 進(jìn)程,解析配置文件,初始化執(zhí)行環(huán)境,然后再 fork 多個(gè) worker 進(jìn)程(與 Nginx 有點(diǎn)像),當(dāng) HTTP 請求過來時(shí),master 進(jìn)程將其會(huì)傳遞給一個(gè) worker 進(jìn)程,然后立即可以接受下一個(gè)請求,這樣就避免了重復(fù)的初始化操作,效率自然也就提高了。而且當(dāng) worker 進(jìn)程不夠用時(shí),master 進(jìn)程還可以根據(jù)配置預(yù)先啟動(dòng)幾個(gè) worker 進(jìn)程等著;當(dāng)空閑 worker 進(jìn)程太多時(shí),也會(huì)關(guān)掉一些,這樣不僅提高了性能,還節(jié)約了系統(tǒng)資源。
這樣一來,PHP-FPM 就好理解了,F(xiàn)astCGI 只是一個(gè)協(xié)議規(guī)范,需要每個(gè)語言具體去實(shí)現(xiàn),PHP-FPM 就是 PHP 版本的 FastCGI 協(xié)議實(shí)現(xiàn),有了它,就是實(shí)現(xiàn) PHP 腳本與 Web 服務(wù)器(通常是 Nginx)之間的通信,同時(shí)它也是一個(gè) PHP SAPI,從而構(gòu)建起 PHP 解釋器與 Web 服務(wù)器之間的橋梁。
PHP-FPM 負(fù)責(zé)管理一個(gè)進(jìn)程池來處理來自 Web 服務(wù)器的 HTTP 動(dòng)態(tài)請求,在 PHP-FPM 中,master 進(jìn)程負(fù)責(zé)與 Web 服務(wù)器進(jìn)行通信,接收 HTTP 請求,再將請求轉(zhuǎn)發(fā)給 worker 進(jìn)程進(jìn)行處理,worker 進(jìn)程主要負(fù)責(zé)動(dòng)態(tài)執(zhí)行 PHP 代碼,處理完成后,將處理結(jié)果返回給 Web 服務(wù)器,再由 Web 服務(wù)器將結(jié)果發(fā)送給客戶端。這就是 PHP-FPM 的基本工作原理,
PS:最大請求數(shù):最大處理請求數(shù)是指一個(gè)php-fpm的worker進(jìn)程在處理多少個(gè)請求后就終止掉,master進(jìn)程會(huì)重新respawn一個(gè)新的。
這個(gè)配置的主要目的是避免php解釋器或程序引用的第三方庫造成的內(nèi)存泄露。
pm.max_requests = 10240