PHP 四大運行模式深度對比
PHP 的運行模式決定了請求如何被處理、進程如何管理、性能邊界在哪裡。本文從原理、流程、優缺點、適用場景四個維度對比 CLI、CGI、FastCGI、mod_php,並解析 PHP-FPM 與 Nginx/Apache 的協作細節。
1. CLI(Command Line Interface)
- 用途:腳本任務、定時任務、佇列消費、安裝腳本。
- 特點:無 HTTP 頭、無超時限制、標準輸入輸出、當前目錄不自動切換。
- 啟動:
php -f script.php 或 Shebang #!/usr/bin/env php。
2. CGI(Common Gateway Interface)
- 原理:Web Server 對每個請求
fork() 一個 PHP 進程,通過環境變量傳遞請求信息,標準輸出返回響應,進程結束。
- 缺點:頻繁創建/銷毀進程開銷大,無法復用資源(數據庫連接、Opcode 緩存)。
- 現狀:生產環境已基本淘汰。
3. FastCGI
- 改進:常駐主進程管理多個 Worker 進程池,Web Server 通過 Socket(TCP/Unix)轉發請求,Worker 循環處理多個請求。
- 關鍵組件:PHP-FPM(FastCGI Process Manager)負責進程池管理、平滑重載、慢日誌、狀態頁。
- 流程:
- Nginx 接收請求 →
fastcgi_pass unix:/run/php/php-fpm.sock
- PHP-FPM Master 分派給空閒 Worker
- Worker 解析執行腳本 → 返回響應 → 繼續等待下一請求
- 優勢:進程復用、獨立於 Web Server、支援分佈式部署(Worker 可跨機器)。
4. mod_php(Apache 模塊)
- 原理:PHP 作為 Apache 子進程內嵌模塊加載,每個 Apache Worker 內含 PHP 解釋器。
- MPM 模式影響:
- Prefork:單線程多進程,每進程獨佔內存,穩定但佔用大。
- Worker/Event:多線程,需 PHP 編譯為線程安全(ZTS),擴展兼容性較差。
- 配置修改需重啟 Apache 生效;.htaccess 支援靈活。
對比總結表
| 維度 | CLI | CGI | FastCGI (PHP-FPM) | mod_php |
| 進程模型 | 單進程 | 每請求一進程 | 常駐進程池 | Apache 子進程內嵌 |
| 性能 | N/A | 極低 | 高 | 中高 |
| 資源復用 | 無 | 無 | 是(連接、Opcode) | 進程級復用 |
| 部署架構 | 獨立 | Web Server 同機 | 可分離部署 | 綁定 Apache |
| 配置熱加載 | N/A | 支援 | 支援 (reload) | 需重啟 Apache |
| 推薦場景 | 腳本/CLI | 淘汰 | 現代標準 | legacy Apache |
選型建議
- 新項目:Nginx + PHP-FPM(FastCGI),性能、彈性、運維工具鏈最成熟。
- 遷移舊項目:若已深度依賴 .htaccess、mod_rewrite,可暫用 mod_php(Prefork),規劃遷移。
- 微服務/Serverless:PHP-FPM Worker 可作為獨立服務註冊到服務發現。
理解運行模式是性能調優、故障排查、架構演進的基石。