環境:RedHat 5.5 + Nginx + PHP-FPM。症狀:top 顯示多個 php-cgi 進程 CPU 長期佔用 90%+,負載飆升至 100+,靜態資源訪問正常,Nginx 無報錯,明確為 PHP 執行層問題。
表現:啟動 10 分鐘後響應極慢,CPU 飆高。
定位:php -m | grep eaccelerator 確認已加載;對比 PHP 版本與擴展編譯版本。
解決:php.ini 註釋 extension=eaccelerator.so,改用 OPcache(PHP 5.5+ 內置)或 APCu。
表現:負載持續 100+,單核跑滿。
定位——利用 /proc 文件系統:
# 1. 找到高 CPU 進程 PID
ps aux | grep php-cgi | sort -k3 -nr | head -5
# 2. 查看該進程正在執行的腳本
ls -l /proc//fd/ | grep '\.php'
# 3. 追蹤系統調用(需安裝 strace)
strace -p -s 200 -o trace.log
# 4. 分析 trace.log,尋找重複的 poll/read/write/lstat 等調用
解決:修復業務代碼邏輯(如遞歸無終止條件、while(true) 缺 break、大數據集未分頁處理)。
表現:少量進程(<10 個)CPU 98%,負載 4-8,請求堵塞。
根因:默認 session.save_handler = files,高併發下大量進程競爭同一 Session 文件鎖(flock)。
定位:strace -p 大量 flock(..., LOCK_EX) 等待。
解決方案對比:
| 方案 | 適用場景 | 實施成本 |
|---|---|---|
| 改用 Redis/Memcached 存儲 Session | 分佈式部署、高併發 | 低(修改 php.ini + 安裝擴展) |
| 啟用 session.write_short_circuit(PHP 7.1+) | 單機、輕量級 | 極低(僅配置) |
| 調整 session.gc_probability/divisor 降低 GC 頻率 | 輔助優化 | 極低 |
代碼層面:僅在必要時 session_start(),及時 session_write_close() 釋放鎖 | 根治 | 中(需代碼重構) |
file_get_contents/cURL 無 CURLOPT_TIMEOUT)。preg_match 處理長文本)。定位:同樣通過 strace 或 xhprof/xdebug.profiler 火焰圖定位熱點函數。
# 實時監控 PHP 進程 CPU/內存
watch -n 1 "ps aux | grep php-cgi | awk '{print \$2,\$3,\$4,\$11}'"
# 慢日誌分析(需開啟 php-fpm slowlog)
tail -f /usr/local/php/var/log/slow.log | awk -F'[' '{print $2}' | awk -F']' '{print $1}' | sort | uniq -c | sort -nr
# 火焰圖生成(需安裝 perf + FlameGraph)
perf record -g -p -- sleep 30
perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > php-flame.svg
set_time_limit(0)、強制外部調用設置超時。request_terminate_timeout = 30s、request_slowlog_timeout = 5s。php_fpm_cpu_usage、php_fpm_active_processes,閾值觸發鉤子自動重啟 Worker 池。php-cgi CPU 狂飆本質是**代碼層面的資源失控**。從擴展兼容、死循環、Session 鎖、異步缺失四個維度切入,配合 /proc、strace、slowlog、火焰圖工具鏈,可實現「分鐘級定位、小時級修復」。長遠看,建立「開發規範 → 壓測驗證 → 運行時守護 → 監控閉環」的工程化體系才是治本之策。
Windows Server 2003 部署檔案服務完整實戰:從角色安裝、磁碟配額、索引服務到權限精細管控的教學式演示
phpMyAdmin 完整安裝與配置教學:從下載到資料庫管理全攻略
多圖詳解蘋果「雪豹」伺服器系統安裝教程:Mac OS X Server 10.6 部署全記錄
CentOS 自動備份腳本實戰:網站目錄 + MySQL 數據庫定時打包上傳 FTP
IIS 優化實戰第二彈:eAccelerator 加速 PHP 執行效率完整部署指南 (Windows 2003 + IIS 6)
Apache mod_proxy_balancer 負載均衡完整配置指南:權重、演算法、健康檢查與監控