PHP FPM (FastCGI Process Manager) 是一個用來管理 PHP FastCGI 進程的工具。它是 PHP 官方推薦的 FastCGI 進程管理工具,它的工作原理如下:
首先,我們需要了解一下 FastCGI 協議的工作流程。FastCGI(Fast Common Gateway Interface)是一個開放的協議,是 CGI 協議的一種改進版。它可以讓 Web 服務器和應用服務器之間通過 TCP 或 Unix 域套接字建立連接,實現有效的通信。FastCGI 協議將 CGI 協議中的每個 CGI 進程對應一個請求變為多個請求共享一個 CGI 進程,從而提高了請求處理的效率。
換言之,FastCGI 通過復用 PHP 進程來處理多個請求,從而減少了進程重啟的次數。但是,如果用單一進程處理所有的請求,可能會導致進程崩潰或者消耗過多的資源。這時就需要一個進程管理工具來管理 PHP 進程,這就是 PHP FPM 的作用。
當 Web 服務器(比如 Nginx)接收到請求后,會將請求發送給 PHP FPM 進程管理器。PHP FPM 進程管理器會根據以下參數來管理進程:
1. max_children:PHP 進程池中允許創建的最大子進程數。
2. start_servers:啟動時 PHP 進程池中的子進程數。
3. min_spare_servers:PHP 進程池中保持的最小空閑子進程數,當空閑子進程少于此值時,PHP FPM 進程管理器會創建新的子進程,直到達到 max_children。
4. max_spare_servers:PHP 進程池中保持的最大空閑子進程數,當空閑子進程超過此值時,PHP FPM 進程管理器會關閉一些子進程直到達到 min_spare_servers。
其中,start_servers 和 min_spare_servers 的值應該相等或者只有一點點差異,這樣可以大幅減少創建子進程時的負擔。
如果新的請求到來時,PHP 進程池中的空閑子進程數量已經達到了 min_spare_servers,那么這個請求會被分配到一個空閑的子進程中處理。如果 PHP 進程池已經達到了 max_children 的上限,則 PHP FPM 進程管理器會將請求掛起并等待子進程的空閑。
由于 PHP FPM 進程管理器可以自動重啟崩潰的進程,所以我們不必擔心 PHP 進程的穩定性問題。同時,我們也可以通過調整 max_children 和其他參數來優化 PHP 進程池的性能。
因此,可以看出 PHP FPM 進程管理器是一個非常重要的工具,它可以有效地管理 PHP 進程,從而提高 FastCGI 協議的性能和穩定性。
下面是 PHP FPM 進程管理器的配置文件示例:
[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 進程管理器,使用 Unix 域套接字來監聽請求,并將請求分配給 nginx 用戶和組。此外,我們還將進程池中的最大子進程數設置為 50,啟動時的子進程數為 10,最小空閑子進程數為 5,最大空閑子進程數為 35,請求超時時間為 300 秒,慢日志超時時間為 150 秒,并將日志寫入到相應的日志文件中。 通過了解 PHP FPM 進程管理器的工作原理,我們可以更好地優化服務器性能,增強用戶體驗。