在 PHP 部署與效能調優的道路上,CGI、FastCGI、PHP-CGI、PHP-FPM 這幾個概念繞不開、也最容易混淆。本文從歷史演進、工作原理、優缺點對比三個維度,為你梳理清晰的知識脈絡。
CGI(Common Gateway Interface,公共閘道介面) 是 Web 伺服器與外部程式溝通的標準協議。早期 Web 伺服器只能處理靜態檔案,動態內容需交給外部程式(Perl、C、PHP 等)處理。
fork-and-execute 模式導致效能極差——每次請求都要重複「啟動解釋器 → 載入配置 → 初始化資料結構」的昂貴操作,高併發下伺服器輕易癱瘓。
FastCGI 是 CGI 的改良版,核心思想是 「常駐進程」:解釋器啟動後常駐記憶體,不再重複啟動銷毀。
多進程模型消耗較多記憶體。典型配置:Nginx + PHP-FPM,每個 php-cgi 進程約 20-30MB,64 進程約 1.2-2GB 記憶體。小記憶體伺服器需適當減少進程數。
PHP 內建的 php-cgi 可作為 FastCGI 進程,但缺乏進程管理能力:
PHP-FPM(FastCGI Process Manager) 解決了 php-cgi 的所有痛點,現為 PHP 官方標配(PHP 5.3.3+ 內建)。
reload 即可生效,零停機[www] pm = dynamic pm.max_children = 50 pm.start_servers = 10 pm.min_spare_servers = 5 pm.max_spare_servers = 20 pm.max_requests = 500 request_slowlog_timeout = 5s slowlog = /var/log/php-fpm/slow.log
早期常搭配 Nginx 使用,現已獨立為專案。缺點是配置分散、管理不如 PHP-FPM 直觀、易崩潰需 crontab 守護。PHP 5.3.3 後 PHP-FPM 完全可替代之。
| 特性 | CGI | FastCGI | PHP-CGI | PHP-FPM |
|---|---|---|---|---|
| 進程模型 | 每請求一進程 | 常駐進程池 | 常駐但無管理 | 智慧進程池 |
| 效能 | 極差 | 優秀 | 優秀 | 優秀+可調優 |
| 平滑重載 | 不適用 | 視管理器而定 | 不支援 | 支援 |
| 進程監控 | 無 | 視管理器而定 | 無 | 內建狀態頁/慢日誌 |
| 推薦場景 | 已淘汰 | 通用協議標準 | 測試/簡單場景 | 生產環境首選 |
Nginx + PHP-FPM 是目前主流高效能 PHP 部署架構。啟用 PHP-FPM 只需編譯時加入 --enable-fpm,或直接使用官方預編譯套件。配合 Opcache、合理的進程池配置、慢日誌分析,即可構建穩定高效的 PHP 運行環境。