PHP FPM (FastCGI Process Manager) 是一個(gè)用來(lái)管理 PHP FastCGI 進(jìn)程的工具。它是 PHP 官方推薦的 FastCGI 進(jìn)程管理工具,它的工作原理如下:
首先,我們需要了解一下 FastCGI 協(xié)議的工作流程。FastCGI(Fast Common Gateway Interface)是一個(gè)開(kāi)放的協(xié)議,是 CGI 協(xié)議的一種改進(jìn)版。它可以讓 Web 服務(wù)器和應(yīng)用服務(wù)器之間通過(guò) TCP 或 Unix 域套接字建立連接,實(shí)現(xiàn)有效的通信。FastCGI 協(xié)議將 CGI 協(xié)議中的每個(gè) CGI 進(jìn)程對(duì)應(yīng)一個(gè)請(qǐng)求變?yōu)槎鄠€(gè)請(qǐng)求共享一個(gè) CGI 進(jìn)程,從而提高了請(qǐng)求處理的效率。
換言之,F(xiàn)astCGI 通過(guò)復(fù)用 PHP 進(jìn)程來(lái)處理多個(gè)請(qǐng)求,從而減少了進(jìn)程重啟的次數(shù)。但是,如果用單一進(jìn)程處理所有的請(qǐng)求,可能會(huì)導(dǎo)致進(jìn)程崩潰或者消耗過(guò)多的資源。這時(shí)就需要一個(gè)進(jìn)程管理工具來(lái)管理 PHP 進(jìn)程,這就是 PHP FPM 的作用。
當(dāng) Web 服務(wù)器(比如 Nginx)接收到請(qǐng)求后,會(huì)將請(qǐng)求發(fā)送給 PHP FPM 進(jìn)程管理器。PHP FPM 進(jìn)程管理器會(huì)根據(jù)以下參數(shù)來(lái)管理進(jìn)程:
1. max_children:PHP 進(jìn)程池中允許創(chuàng)建的最大子進(jìn)程數(shù)。
2. start_servers:?jiǎn)?dòng)時(shí) PHP 進(jìn)程池中的子進(jìn)程數(shù)。
3. min_spare_servers:PHP 進(jìn)程池中保持的最小空閑子進(jìn)程數(shù),當(dāng)空閑子進(jìn)程少于此值時(shí),PHP FPM 進(jìn)程管理器會(huì)創(chuàng)建新的子進(jìn)程,直到達(dá)到 max_children。
4. max_spare_servers:PHP 進(jìn)程池中保持的最大空閑子進(jìn)程數(shù),當(dāng)空閑子進(jìn)程超過(guò)此值時(shí),PHP FPM 進(jìn)程管理器會(huì)關(guān)閉一些子進(jìn)程直到達(dá)到 min_spare_servers。
其中,start_servers 和 min_spare_servers 的值應(yīng)該相等或者只有一點(diǎn)點(diǎn)差異,這樣可以大幅減少創(chuàng)建子進(jìn)程時(shí)的負(fù)擔(dān)。
如果新的請(qǐng)求到來(lái)時(shí),PHP 進(jìn)程池中的空閑子進(jìn)程數(shù)量已經(jīng)達(dá)到了 min_spare_servers,那么這個(gè)請(qǐng)求會(huì)被分配到一個(gè)空閑的子進(jìn)程中處理。如果 PHP 進(jìn)程池已經(jīng)達(dá)到了 max_children 的上限,則 PHP FPM 進(jìn)程管理器會(huì)將請(qǐng)求掛起并等待子進(jìn)程的空閑。
由于 PHP FPM 進(jìn)程管理器可以自動(dòng)重啟崩潰的進(jìn)程,所以我們不必?fù)?dān)心 PHP 進(jìn)程的穩(wěn)定性問(wèn)題。同時(shí),我們也可以通過(guò)調(diào)整 max_children 和其他參數(shù)來(lái)優(yōu)化 PHP 進(jìn)程池的性能。
因此,可以看出 PHP FPM 進(jìn)程管理器是一個(gè)非常重要的工具,它可以有效地管理 PHP 進(jìn)程,從而提高 FastCGI 協(xié)議的性能和穩(wěn)定性。
下面是 PHP FPM 進(jìn)程管理器的配置文件示例:
[global] pid = /var/run/php-fpm.pid error_log = /var/log/php-fpm.log [www] listen = /var/run/php-fpm.sock user = nginx group = nginx pm = dynamic pm.max_children = 50 pm.start_servers = 10 pm.min_spare_servers = 5 pm.max_spare_servers = 35 request_terminate_timeout = 300 request_slowlog_timeout = 150 slowlog = /var/log/php-fpm-slow.log在該示例中,我們配置了 PHP FPM 進(jìn)程管理器,使用 Unix 域套接字來(lái)監(jiān)聽(tīng)請(qǐng)求,并將請(qǐng)求分配給 nginx 用戶和組。此外,我們還將進(jìn)程池中的最大子進(jìn)程數(shù)設(shè)置為 50,啟動(dòng)時(shí)的子進(jìn)程數(shù)為 10,最小空閑子進(jìn)程數(shù)為 5,最大空閑子進(jìn)程數(shù)為 35,請(qǐng)求超時(shí)時(shí)間為 300 秒,慢日志超時(shí)時(shí)間為 150 秒,并將日志寫(xiě)入到相應(yīng)的日志文件中。 通過(guò)了解 PHP FPM 進(jìn)程管理器的工作原理,我們可以更好地優(yōu)化服務(wù)器性能,增強(qiáng)用戶體驗(yàn)。