SAPI (Server API) 核心概念
PHP 與 Web 伺服器互動的介面稱為 SAPI。不同 SAPI 決定了進程管理、效能特性、部署架構。常見四種:
1. CGI (Common Gateway Interface)
- 機制:每個請求
fork 一個新進程 → 載入 php.ini、擴展、初始化 → 處理請求 → 結束進程。
- 優點:跨平台、與伺服器解耦、安全性高 (進程隔離)。
- 缺點:效能極差,重複載入開銷大,高併發下記憶體/CPU 耗盡。
- 現狀:生產環境已淘汰。
2. FastCGI (長驻進程模式)
- 機制:Master 進程啟動 → 預先派生多個 Worker 進程 (php-cgi) → 請求到達 → Master 分派給閒置 Worker → Worker 處理完保持存活等待下一請求。
- 關鍵元件:PHP-FPM (FastCGI Process Manager) 管理進程池、平滑重啟、慢日誌、狀態頁。
- 優點:效能優異,避免重複初始化,支援持久資料庫連線、OpCache 共享。
- 架構:Nginx/Apache (mod_proxy_fcgi) ↔ Unix Socket/TCP 9000 ↔ PHP-FPM Master ↔ Workers。
- 主流選擇:現代 PHP 部署標準 (Nginx + PHP-FPM)。
3. Apache 模組 (mod_php / php_apache)
- 機制:PHP 內嵌於 Apache 進程中,Apache 預先分叉多個子進程,每個子進程載入完整 PHP 解釋器。
- 優點:設定簡單 (
LoadModule php_module)、.htaccess 支援、無需額外程序管理。
- 缺點:記憶體佔用高 (每個 Apache 子進程含 PHP)、無法平滑更新 PHP (需重啟 Apache)、靜態檔案請求也佔用 PHP 記憶體。
- 適用:中小型專案、共享主機、需大量 Rewrite 規則的舊專案。
4. CLI (Command Line Interface)
效能與架構對比總結
| 維度 | CGI | FastCGI (PHP-FPM) | Apache 模組 | CLI |
| 進程模型 | 每請求一進程 | 預派生 Worker 池 | Apache 子進程內嵌 | 單進程/腳本 |
| 啟動開銷 | 極高 | 僅啟動時一次 | Apache 啟動時 | 每腳本一次 |
| 記憶體效率 | 低 | 高 (共享 OpCache) | 中 (每進程獨佔) | 低 |
| 併發能力 | 極弱 | 強 (可調 Worker 數) | 中 (受限 MaxClients) | 不適用 |
| 部署複雜度 | 低 | 中 (需配置 FPM + Web Server) | 低 | 極低 |
| 生產推薦度 | ❌ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐ (非 Web 用途) |
選擇建議
- 新專案 / 高流量:Nginx + PHP-FPM (FastCGI),搭配 OpCache、JIT (PHP 8+)。
- 舊專案維護 / 共享主機:Apache + mod_php 仍可接受,注意記憶體調優。
- 微服務 / CLI 工具:獨立 PHP CLI 程式,透過 Supervisor/Systemd 管理常駐進程。
- 開發環境:
php -S 或 Docker 容器化 (Nginx + PHP-FPM)。