A. php-FPM詳解
PHP-FPM是PHP FastCGI進程管理器,專為管理PHP進程池設計,用於接收web伺服器請求。
第一部分,為什麼出現PHP-FPM?PHP-FPM的誕生源自PHP-FastCGI的需求。為有效管理PHP-FastCGI而出現的程序。
第二部分,了解PHP-FastCGI。它只是一個解析PHP請求並返回結果的CGI程序,並不負責管理進程。
第三部分,為何不稱為PHP-CGI?在PHP-FastCGI之前,存在PHP-CGI,但其執行效率低下,最終被PHP-FastCGI取代。
第四部分,解釋FastCGI與CGI的區別。在FastCGI時代,當web伺服器(如nginx)接收到請求並識別為動態PHP請求時,會將其轉給PHP處理。在CGI模式下,每次請求時都需要讀取php.ini配置,初始化執行環境,耗時且重復。
第五部分,FastCGI的效率提升。FastCGI允許一次啟動一個主進程(master),讀取一次配置,然後啟動多個工作進程(worker)。當請求來臨時,master將請求傳遞給worker,避免了重復的初始化工作。
第六部分,PHP-FPM的工作原理。PHP-FPM創建一個主進程來控制何時以及如何將HTTP請求轉發給一個或多個子進程處理。主進程還負責管理進程的創建與銷毀,以適應Web應用流量的變化。
安裝部分,PHP在5.3.3之後將PHP-FPM整合到核心代碼中,無需單獨下載安裝。只需在編譯PHP源碼時添加--enable-fpm即可啟用PHP-FPM支持。
全局配置方面,CentOS中PHP-FPM的主配置文件為/etc/php7/php-fpm.conf,配置內容通常包括進程池定義。
在CentOS中,PHP-FPM主配置文件頂部引入了進程池定義文件,通常使用www.conf作為默認配置文件。進行必要的編輯保存後,重啟PHP-FPM主進程。
PHP-FPM進程池的詳細配置請參考php.net/manual/install文檔。
針對Company開發環境的配置,提供測試環境與生產環境的具體配置示例。以nginx為例,說明如何轉發請求給PHP-FPM。
最後,針對PHPer進階時遇到的問題,提供了一系列資料,涵蓋分布式架構、高可擴展性、高性能、高並發、伺服器性能調優、TP6、Laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等高級進階干貨,需要的讀者可以免費獲取。
B. PHP中的FPM是做什麼的
FPM(FastCGI 進程管理器)用於替換 PHP FastCGI 的大部分附加功能,對於高負載網站是非常有用的。它的功能包括:
支持平滑停止/啟動的高級進程管理功能;
可以工作於不同的 uid/gid/chroot 環境下,並監聽不同的埠和使用不同的 php.ini 配置文件(可取代 safe_mode 的設置);
stdout 和 stderr 日誌記錄;
在發生意外情況的時候能夠重新啟動並緩存被破壞的 opcode;
文件上傳優化支持;
"慢日誌" - 記錄腳本(不僅記錄文件名,還記錄 PHP backtrace 信息,可以使用 ptrace或者類似工具讀取和分析遠程進程的運行數據)運行所導致的異常緩慢;
fastcgi_finish_request() - 特殊功能:用於在請求完成和刷新數據後,繼續在後台執行耗時的工作(錄入視頻轉換、統計處理等);
動態/靜態子進程產生;
基本 SAPI 運行狀態信息(類似Apache的 mod_status);
基於 php.ini 的配置文件。
C. php-fpm特色功能
php-fpm的特色功能為用戶提供了多種便利性和優化選項,這些特性以"不打斷"的方式實現,既不影響php的基本功能,又能顯著提升用戶體驗和伺服器性能。
在默認設置下,如果php腳本出現語法錯誤,用戶僅能收到一個空的"200 ok"頁面,這顯然不夠友好。通過在php.ini中配置"error_header"選項,可以將錯誤碼展示給用戶,例如設置為"HTTP/1.0 550 Server Made Big Boo",從而中斷web伺服器請求並顯示正確的錯誤頁面。需要在php.ini中添加:"fastcgi.error_header = "HTTP/1.0 550 Server Made Big Boo"。在php-5.2.4中,已經實現了類似功能,如果腳本包含語法錯誤且display_errors設置為off,會立即返回"HTTP/1.0 500 Internal Server Error",但此行為與display_errors設置相關聯。
針對大POST請求和文件上傳的優化,php-fpm通過將請求體寫入臨時文件,然後通過fastcgi協議傳遞文件名而不是請求體,實現加速處理。此功能僅在php與web伺服器運行在同一台機器上時有效。在nginx配置中,可以使用如下示例配置:將"fastcgi_pass_request_body"設置為"off","client_body_in_file_only"設置為"clean",並在fastcgi參數中添加"REQUEST_BODY_FILE"參數,指定請求體文件名。
php中無需進行額外配置,如果接收到"REQUEST_BODY_FILE"參數,將讀取其中的請求體;如果沒有該參數,則從fastcgi協議中讀取請求體。結合使用內存文件系統(如Linux的tmpfs)可以進一步優化處理速度,例如設置"client_body_temp_path"以利用tmpfs。
為了提高某些php請求的處理速度,可以使用"fastcgi_finish_request()"特性。此特性允許在頁面生成後進行某些處理,例如在memcached中保存session或處理上傳的視頻、統計等。此操作可以在響應輸出被web伺服器提供給客戶端之前完成,同時觸發"shutdown"函數運行。
通過配置"request_slowlog_timeout"選項,可以追蹤執行緩慢的腳本並將其與調用棧一同記錄在日誌文件中,以幫助診斷問題。例如,設置如下配置:"request_slowlog_timeout"為5秒,"slowlog"設置為"logs/slow.log"。這樣,當腳本運行超過5秒時,系統會記錄其調用棧信息,可能是因為資料庫響應速度慢導致的。