前言
Web 伺服器如何執行 PHP 腳本?歷經 CGI、模組模式、FastCGI 三代演進。理解這三種架構差異,有助於選擇適合專案的部署方案(Apache + mod_php、Nginx + PHP-FPM 等)。
模式一:內建模組模式
代表:Apache + mod_php (mod_php5)
- PHP 解譯器編譯為 Apache 模組,常駐於 Apache 進程記憶體中
- 請求到達時,直接在同一進程內執行 PHP,無需進程間通訊
- 優點:設定簡單、效能穩定、相容性好
- 缺點:Apache 進程體積大(每個 worker 都載入 PHP)、記憶體佔用高、難以獨立升級 PHP、非執行緒安全(需用 prefork MPM)
模式二:CGI 模式
Common Gateway Interface
- 每個請求啟動一個新的 PHP CGI 進程,執行完畢後結束
- 缺點:效能極差(重複 fork/exec 開銷大)、安全性較低、幾乎已被淘汰
模式三:FastCGI 模式
FastCGI = CGI 改良版,採用 C/S 架構
- PHP 解譯器以常駐 Daemon 進程池形式運行(如 php-fpm master + 多個 worker)
- Web Server(Nginx/Lighttpd)透過 Socket(TCP/Unix)轉發請求給 FastCGI 進程
- 處理完畢回傳結果(通常為 HTML),連線可重用
- 優點:
- Web Server 與 PHP 解譯器完全分離,各司其職
- Nginx/Lighttpd 輕量高併發,專注靜態資源與反向代理
- PHP 進程池可獨立管理、平滑重啟、限制資源
- 效能可達 Apache + mod_php 的 5~10 倍(高併發場景)
- 缺點:高流量下 Daemon 可能過載、記憶體洩漏導致重啟(早期 spawn-fcgi 問題)
主流 FastCGI 實作組合
| 組合 | 特點 |
| Lighttpd + spawn-fcgi | 早期方案,spawn-fcgi 隨 Lighttpd 內建,高併發下曾出現記憶體洩漏、自動重啟問題 |
| Nginx + PHP-FPM (推薦) | PHP-FPM 為 PHP 官方維護的 FastCGI 進程管理器,編譯進 PHP 核心,高併發穩定、功能豐富(平滑重啟、慢日誌、狀態頁) |
| Nginx + spawn-fcgi | 需額外安裝 Lighttpd 取得 spawn-fcgi,配置繁瑣,已漸少使用 |
為何 PHP-FPM 取代 spawn-fcgi?
- 作為 PHP Patch 開發,編譯進核心,效能更優
- 進程管理演算法更先進,高併發不易崩潰
- 支援動態/靜態/按需進程模式、慢請求日誌、狀態監控
總結:三大主流 Stack 對比
- Apache + mod_php:傳統、簡單、適合中小型、相容 .htaccess
- Lighttpd + spawn-fcgi:輕量但穩定性較弱,逐漸邊緣化
- Nginx + PHP-FPM:現代高併發標準配置,效能最佳、架構清晰、運維友善
選型建議
- 新專案、高併發、微服務架構 → Nginx + PHP-FPM
- 舊專案遷移、需 .htaccess、共享主機環境 → Apache + mod_php
- 嵌入式、極度資源受限 → Lighttpd(但建議改用 Nginx)