「FastCGI 是協議,PHP-FPM 實現了協議」「PHP-FPM 是 FastCGI 進程管理器」「PHP-FPM 是 PHP 內核補丁」「PHP-CGI 是自帶的 FastCGI 管理器」——網上眾說紛紜。本文從 CGI 起源講起,梳理 FastCGI 協議、PHP-CGI 程序、PHP-FPM 管理器、內核整合演進的完整脈絡,一圖勝千言。
| 術語 | 本質 | 角色 |
|---|---|---|
| CGI | 協議 | 規定 Web Server 與後端程序交互的數據格式、環境變量標準 |
| FastCGI | 協議(CGI 增強版) | 持久進程、多路復用、避免每請求 fork/exec 開銷 |
| PHP-CGI | 程序(FastCGI 應用) | PHP 官方提供的 FastCGI 進程,**僅能解析請求,無進程管理能力** |
| PHP-FPM | 進程管理器 | 管理 PHP-CGI 進程池(master/worker)、平滑重啟、自適應調度、狀態監控 |
| spawn-fcgi | 進程管理器 | lighttpd 衍生,早期常用,功能較簡單 |
1. 遠古:CGI 模式 Nginx --fork/exec--> PHP-CGI (解析 php.ini, 初始化, 處理, 退出) --返回--> Nginx 缺點:每請求重複初始化,性能極差 2. FastCGI 協議誕生 (1996) 規範:持久進程、Unix Socket/TCP 通信、環境變量標準化 3. PHP-CGI 支持 FastCGI (PHP 4.3+) php-cgi -b 127.0.0.1:9000 # 啟動 FastCGI 監聽 缺點:無進程管理、崩潰不重啟、配置修改需手動重啟 4. spawn-fcgi (lighttpd 衍生) 管理 php-cgi 進程池,基礎守護功能 5. PHP-FPM 誕生 (2004, Andrei Nigmatulin) 專為 PHP 設計的 FastCGI 進程管理器: - Master/Worker 架構 - 自適應進程數 (pm = dynamic/ondemand/static) - 平滑重啟 (reload 配置不中斷服務) - 慢日誌、請求終止超時、狀態頁面 - 2010 年併入 PHP 核心 (PHP 5.3.3+),編譯參數 --enable-fpm 6. 現狀:PHP-FPM 成為事實標準 生產環境 99% 使用 Nginx + PHP-FPM (Unix Socket)
+------------------+
| Nginx (Web) |
| (內容分發者) |
+--------+---------+
|
FastCGI 協議 (TCP/Unix Socket)
|
+--------v---------+
| PHP-FPM (Master)|
| - 讀取 php.ini |
| - 管理 Worker |
+--------+---------+
|
+--------------+--------------+
| | |
+------v------+ +------v------+ +------v------+
| PHP-CGI (W) | | PHP-CGI (W) | | PHP-CGI (W) |
| 解析請求 | | 解析請求 | | 解析請求 |
+-------------+ +-------------+ +-------------+
半對。PHP-FPM 管理的是 **PHP-CGI** 進程,PHP-CGI 才是實現 FastCGI 協議的應用程序。PHP-FPM 是**進程管理器**,不直接處理協議解析。
對。管理對象是 php-cgi 進程。Master 進程讀取配置、fork Worker、監控健康、平滑重啟。
歷史上對,現在不對。早期需對 PHP 源碼打補丁再編譯;PHP 5.3.3 起併入核心,--enable-fpm 即可編譯,無需補丁。
是重要動機之一。PHP-FPM 實現「新 Worker 載入新配置,舊 Worker 處理完當前請求退出」的平滑過渡機制。
錯。PHP-CGI **只是** 解析器/應用程序,**無任何管理功能**。
; php-fpm.conf / www.conf [www] user = www group = www listen = /var/run/php-fpm.sock ; Unix Socket 性能優於 TCP listen.owner = www listen.group = www listen.mode = 0660 pm = dynamic pm.max_children = 100 pm.start_servers = 20 pm.min_spare_servers = 10 pm.max_spare_servers = 30 pm.max_requests = 1000 ; 防止內存洩漏,定期回收進程 request_terminate_timeout = 60s ; 單請求超時保護 request_slowlog_timeout = 5s ; 慢日誌閾值 slowlog = /var/log/php-fpm/slow.log php_admin_value[error_log] = /var/log/php-fpm/error.log php_admin_flag[log_errors] = on
**「CGI 是協議,FastCGI 是增強協議,PHP-CGI 是實現協議的程序,PHP-FPM 是管理該程序的進程管理器」**——這句話串聯起所有概念。理解 Master/Worker 架構、平滑重啟原理、自適應進程策略,能讓你從「會配置」進階到「會調優、會排障、會架構」。