首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 運行模式深度對比:mod_php、FastCGI、PHP-FPM 選型指南

     編輯:PHP 綜合知識

核心概念:PHP 處理器

Web 伺服器(Nginx/Apache)本身只處理靜態資源。動態 PHP 程式碼需要「PHP 處理器」解析執行,再將結果(HTML/JSON)返還給 Web 伺服器發送給客戶端。不同運行模式本質上是「Web 伺服器與 PHP 進程通訊方式」的差異。

四大運行模式詳細對比

1. mod_php (Apache 模組模式 / DSO)

# 安裝
apt install libapache2-mod-php

# Apache 載入模組
LoadModule php_module /usr/lib/apache2/modules/libphp.so
優點缺點
安裝簡單、配置極少僅支援 Apache
PHP 解釋器內嵌於 Apache 進程,通訊零開銷每個 Apache 子進程都載入 PHP,靜態請求也佔用記憶體
支援 .htaccess 即時生效修改 php.ini 需重啟 Apache
相容性最好(舊專案)不適合高併發、大量靜態資源場景

適用場景:中小型 Apache 專案、共享主機、需 .htaccess 支援的舊系統

2. CGI (Common Gateway Interface)

每請求 Fork 一個新進程執行 PHP,執行完銷毀。已淘汰,效能極差,僅作歷史參考。

3. FastCGI (協議規範)

# Apache 啟用
a2enmod proxy_fcgi
# 配置
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1
優點缺點
通用協議,支援 Nginx/Apache/Lighttpd/IIS配置相對複雜
持久進程池,避免重複 Fork 開銷需獨立管理 PHP 進程
支援多 PHP 版本共存早期實現(mod_fcgid)進程管理功能弱
支援 suexec 隔離用戶權限

4. PHP-FPM (FastCGI Process Manager) —— 現代標準

# 安裝
apt install php8.2-fpm

# 核心配置 /etc/php/8.2/fpm/pool.d/www.conf
[www]
user = www-data
group = www-data
listen = /run/php/php8.2-fpm.sock  # Unix Socket 效能更高
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
核心優勢說明
優雅重啟平滑重載配置/二進制,不丟失請求
進程管理動態/靜態/按需模式,自適應負載
狀態監控內建 /status 頁面,支援 Prometheus 整合
慢日誌request_slowlog_timeout 定位效能瓶頸
安全隔離chroot、chdir、disable_functions 每池獨立
緊急重啟emergency_restart_threshold 連續失敗自動重啟

Nginx + PHP-FPM 最佳實踐配置

# /etc/nginx/sites-available/default
server {
    listen 80;
    server_name example.com;
    root /var/www/html;
    index index.php;
    
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    
    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;  # Unix Socket
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_read_timeout 300;
    }
    
    # 靜態資源快取
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}

效能基準參考(相對值)

模式靜態請求 QPS動態請求 QPS記憶體佔用維護難度
mod_php★★★★★★★★☆☆高低
FastCGI (mod_fcgid)★★★★★★★★★☆中中
PHP-FPM★★★★★★★★★★可控中

選型決策樹

graph TD
    A[Web Server] -->|Apache| B{專案類型}
    B -->|舊專案/需.htaccess| C[mod_php]
    B -->|現代專案/高併發| D[PHP-FPM]
    A -->|Nginx| E[PHP-FPM 唯一選擇]
    A -->|IIS| F[FastCGI/PHP-FPM]
    D --> G[Unix Socket + 動態進程池]
    G --> H[啟用 OPcache + JIT]

遷移清單:mod_php → PHP-FPM

  1. 安裝 php-fpm,停用 libapache2-mod-php
  2. 啟用 Apache proxy_fcgi 模組
  3. 調整 www.conf 進程池參數
  4. 修改 VirtualHost 使用 ProxyPassMatch 或 SetHandler
  5. 驗證 $_SERVER['PHP_SELF'] 等變數行為一致
  6. 壓測調整 pm.max_children 至 CPU 核心數 × 2-4

總結

2024 年新專案無腦選 Nginx + PHP-FPM (Unix Socket)。mod_php 僅用於維護舊 Apache 專案。FastCGI 是協議,PHP-FPM 是目前最成熟的實現。理解本質差異,才能在架構演進中做正確決策。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved