PHP 在 Linux 環境下有三種主要執行模式,各有效能特性與適用場景。理解其運作原理對效能調優、架構選型至關重要。
一、模組模式 (Apache 2 Handler / mod_php)
運作機制
- Apache 啟動時預先分叉多個子進程駐留記憶體
- 請求到達時直接指派空閒子進程處理,無建立進程延遲
- 請求處理完畢後進程不退出,持續等待下一請求
優缺點
| 優點 | 缺點 |
| 回應速度最快、效能最高 | 記憶體佔用大 (每進程含完整 PHP 解釋器) |
| 配置簡單、相容性好 | PHP 設定變更需重啟 Apache |
| 適合高併發靜態/動態混合站點 | 難以針對不同虛擬主機隔離 PHP 環境 |
二、CGI 模式 (Common Gateway Interface)
運作機制
- 每個請求觸發
fork() 建立子進程
- 載入 PHP 解釋器、解析 php.ini、初始化擴展
- 處理請求、輸出結果
- 進程結束,釋放所有資源
優缺點
| 優點 | 缺點 |
| 進程隔離性好、安全性高 | 效能極差 (反覆 fork/exec、重複初始化) |
| 不佔用常駐記憶體 | 無法使用持久連線 (Persistent Connection) |
| 適用極低流量或特殊安全需求場景 | 高併發下系統負載極高 |
三、FastCGI 模式 (PHP-FPM)
運作原理
- Web Server (Nginx/Apache) 啟動載入 FastCGI 進程管理器
- FastCGI 管理器 (PHP-FPM) 預先啟動多個 PHP 解釋器進程 (php-cgi)
- 請求到達,Web Server 透過 Unix Socket/TCP 連接 FastCGI
- 管理器分派請求給空閒 php-cgi 處理
- 處理完畢回傳結果,php-cgi 進程保持存活等待下一請求
核心優勢
- 常駐進程: 僅啟動時載入一次 php.ini、擴展、初始化資料結構
- 持久連線支援: 資料庫連線可跨請求重用 (mysqli/pdo persistent)
- 進程管理靈活: PHP-FPM 支援動態/靜態/按需進程管理模式
- 隔離性: 不同 Pool 可用不同用戶、php.ini、資源限制
- Web Server 解耦: Nginx + PHP-FPM 成為現代高效架構標配
四、效能對比總結
| 指標 | mod_php | CGI | FastCGI (PHP-FPM) |
| 回應延遲 | 極低 | 高 | 低 |
| 記憶體效率 | 低 | 高 (無常駐) | 中高 (可控) |
| 併發處理 | 優 | 差 | 優 |
| 持久連線 | 支援 | 不支援 | 支援 |
| 隔離性 | 弱 | 強 | 強 (Pool級) |
| 配置彈性 | 低 | 中 | 高 |
| 推薦場景 | Apache 傳統架構 | 極少用 | Nginx/現代架構首選 |
五、生產環境建議
- 新專案: 採用 Nginx + PHP-FPM 架構
- 舊專案維護: Apache 可維持 mod_php 或遷移至 PHP-FPM (mod_proxy_fcgi)
- PHP-FPM 調優關鍵:
pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers 依記憶體與 CPU 核心數設定