1. 安裝并啟用OPcache擴展
OPcache是PHP內置的字節碼緩存擴展,可顯著減少腳本編譯時間,提升重復請求的執行效率。安裝命令(以Ubuntu 22.04+為例):
sudo apt update && sudo apt install php-opcache
編輯php.ini
(路徑可通過php --ini
查看,如/etc/php/8.2/fpm/php.ini
),添加或修改以下配置:
[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128 # 緩存內存大?。∕B),根據服務器內存調整
opcache.max_accelerated_files=10000 # 緩存文件數量上限
opcache.revalidate_freq=2 # 腳本修改后重新驗證頻率(秒)
opcache.fast_shutdown=1 # 快速關閉機制,提升內存回收效率
重啟PHP服務(如使用PHP-FPM):
sudo systemctl restart php8.2-fpm
2. 使用最新穩定版PHP
新版本PHP通常包含性能優化(如JIT編譯器、引擎改進)和安全修復。通過Ondrej Sur的PPA添加最新版PHP倉庫:
sudo add-apt-repository ppa:ondrej/php
sudo apt update
安裝指定版本(如PHP 8.2):
sudo apt install php8.2 php8.2-cli php8.2-fpm php8.2-mysql php8.2-curl
切換Web服務器(如Nginx/Apache)的PHP模塊至新版本,并重啟服務。
3. 優化PHP-FPM進程配置
PHP-FPM(FastCGI進程管理器)比傳統mod_php
更高效,需根據服務器資源調整進程參數(以/etc/php/8.2/fpm/pool.d/www.conf
為例):
dynamic
(動態調整進程數,適合負載波動場景);pm = dynamic
pm.max_children = 50 # 最大子進程數(根據內存計算:總內存/單個進程內存,如16GB內存/256MB≈60)
pm.start_servers = 10 # 啟動時的進程數(建議為max_children的1/5-1/4)
pm.min_spare_servers = 5 # 最小空閑進程數(避免頻繁創建進程)
pm.max_spare_servers = 20 # 最大空閑進程數(避免內存浪費)
pm.max_requests = 1000 # 每個子進程處理的最大請求數(防止內存泄漏)
調整后重啟PHP-FPM:
sudo systemctl restart php8.2-fpm
4. 配置緩存技術(Redis/Memcached)
使用Redis或Memcached緩存頻繁訪問的數據庫查詢結果、會話數據或頁面片段,減少數據庫負載。以Redis為例:
sudo apt install php-redis redis-server
編輯php.ini
啟用擴展:
extension=redis.so
重啟PHP服務后,在代碼中使用Redis緩存(示例):
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'cached_data_key';
if ($data = $redis->get($key)) {
echo $data; // 使用緩存數據
} else {
$data = fetchDataFromDB(); // 從數據庫獲取數據
$redis->setex($key, 3600, $data); // 緩存1小時
echo $data;
}
5. 優化數據庫交互
php.ini
中設置):mysqli.allow_persistent = On
mysqli.max_persistent = 100
SELECT *
,使用預處理語句防止SQL注入;wait_timeout
(默認8小時),避免閑置連接占用資源。6. 代碼級性能優化
str_replace
替代正則表達式(當不需要復雜匹配時);unset()
),尤其是大數組。7. 監控與調優
www.conf
中設置):slowlog = /var/log/php-fpm/slow.log
request_slowlog_timeout = 5s # 超過5秒的請求記錄到慢日志
使用grep
分析慢日志:grep -i "slow" /var/log/php-fpm/slow.log
htop
(查看CPU/內存使用)、vmstat
(查看系統IO)、php-fpm-status
(查看PHP-FPM進程狀態)等工具監控服務器狀態;ab
(Apache Benchmark)或wrk
模擬高并發請求,評估優化效果:ab -n 1000 -c 100 http://yourdomain.com/
8. 其他優化建議
php.ini
中設置):zlib.output_compression = On
zlib.output_compression_level = 6 # 壓縮級別(1-9)