1. 安裝并啟用OPcache擴展
OPcache是PHP內置的字節碼緩存擴展,可避免重復編譯PHP腳本,顯著提升執行速度。Ubuntu上默認包含該擴展,需通過以下步驟啟用:
sudo apt update && sudo apt install php-opcache(根據PHP版本調整包名,如php8.2-opcache)。/etc/php/{version}/fpm/php.ini(PHP-FPM)或/etc/php/{version}/cli/php.ini(CLI),添加/修改以下配置:[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128 # 緩存內存大?。∕B),根據服務器內存調整
opcache.max_accelerated_files=10000 # 最大緩存文件數
opcache.revalidate_freq=60 # 腳本更新檢查間隔(秒)
opcache.enable_cli=1 # CLI模式下也啟用
sudo systemctl restart php{version}-fpm(如php8.2-fpm)。2. 使用最新穩定版PHP
新版本PHP通常包含性能改進、bug修復和優化(如JIT編譯器)。通過Ondrej Sur的PPA安裝最新版:
sudo add-apt-repository ppa:ondrej/phpsudo apt update && sudo apt install php8.2 php8.2-cli php8.2-fpm php8.2-mysql(按需選擇擴展)。sudo update-alternatives --config php。3. 優化PHP-FPM配置
PHP-FPM(FastCGI進程管理器)比傳統mod_php更高效,需調整進程池參數以匹配服務器資源:
/etc/php/{version}/fpm/pool.d/www.conf,調整以下關鍵參數:pm = dynamic # 動態進程管理模式(適合大多數場景)
pm.max_children = 50 # 最大子進程數(根據內存計算:總內存/單個進程內存)
pm.start_servers = 10 # 啟動時的進程數(建議為CPU核心數的2-4倍)
pm.min_spare_servers = 5 # 最小空閑進程數
pm.max_spare_servers = 20 # 最大空閑進程數
pm.max_requests = 500 # 單個進程處理的最大請求數(防止內存泄漏)
fastcgi_pass為:fastcgi_pass unix:/run/php/php{version}-fpm.sock;
sudo systemctl restart php{version}-fpm。4. 配置緩存技術(OPcache+Redis/Memcached)
sudo apt install redis-server php-redis(PHP擴展)。/etc/php/{version}/fpm/php.ini,添加:[redis]
extension=redis.so
redis.host=127.0.0.1
redis.port=6379
redis-cli ping(返回PONG表示成功)。5. 優化數據庫交互
php.ini中設置:mysqli.allow_persistent=On
mysqli.max_persistent=100
SELECT *,使用預處理語句防止SQL注入。PDO或MySQLi的連接池功能復用數據庫連接。6. 代碼層面優化
yield)處理大數據集(避免一次性加載到內存)。unset()釋放不再需要的變量,關閉數據庫連接($conn->close())。Xdebug或Blackfire定位性能瓶頸(如慢函數、重復計算)。7. 內核與系統優化
/etc/security/limits.conf,添加:* soft nofile 65535
* hard nofile 65535
/etc/sysctl.conf,添加:net.core.somaxconn = 1024
net.ipv4.tcp_tw_reuse = 1
應用配置:sudo sysctl -p。8. 監控與持續調優
htop(查看CPU/內存使用)、vmstat(查看系統IO)、Prometheus+Grafana(可視化監控PHP-FPM指標)。/etc/php/{version}/fpm/pool.d/www.conf:slowlog = /var/log/php-fpm/slow.log
request_slowlog_timeout = 5s # 超過5秒的請求記錄到慢日志
分析日志:grep "slowlog" /var/log/php-fpm/slow.log。