CentOS上PHP配置優化指南
優化前需確保系統和軟件包為最新版本,避免已知bug影響性能。使用EPEL和Remi存儲庫安裝最新穩定版PHP(如7.4/8.x)及常用擴展,提升兼容性與性能:
sudo yum update -y
sudo yum install epel-release -y
sudo yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm -y
sudo yum-config-manager --enable remi-php74 # 根據需求選擇PHP版本
sudo yum install php php-cli php-fpm php-mysqlnd php-gd php-mbstring php-xml php-zip -y
PHP-FPM(FastCGI進程管理器)能有效提升PHP處理高并發的能力,需調整以下核心參數(配置文件路徑:/etc/php-fpm.d/www.conf
):
dynamic
(動態調整進程數,平衡性能與資源占用),若服務器長期負載穩定可選擇ondemand
(按需創建進程,節省內存)。pm.max_children
:最大子進程數,需根據服務器內存計算(公式:(可用內存 - 1G) / 單個PHP進程內存(約30-50M)
,例如2G內存服務器可設為50)。pm.start_servers
:啟動時的子進程數,建議設為max_children
的1/4~1/2(如pm.max_children=50
則設為10-25)。pm.min_spare_servers
/pm.max_spare_servers
:空閑進程的最小/最大數量,避免頻繁創建/銷毀進程(如均設為max_children
的1/4,即10-25)。request_terminate_timeout
設置單個請求的超時時間(如30秒),防止長時間運行的腳本占用資源。sudo systemctl restart php-fpm
編輯/etc/php.ini
文件,優化以下關鍵參數以提升性能與穩定性:
memory_limit
設置為256M(根據應用需求調整,如WordPress等常規應用256M足夠,大型應用可設為512M)。max_execution_time
設置為300秒(默認30秒,適用于需要長時間處理的腳本,如數據導入/導出)。upload_max_filesize
和post_max_size
設置為50M(根據業務需求調整,如允許用戶上傳大文件)。display_errors
設為Off
(生產環境隱藏錯誤信息,避免泄露敏感信息),log_errors
設為On
(記錄錯誤到/var/log/php_errors.log
,便于排查問題)。date.timezone
設置為Asia/Shanghai
(或其他所需時區),避免時間相關函數報錯。OPcache緩存PHP腳本編譯后的字節碼,顯著減少腳本加載時間(尤其對頻繁訪問的頁面效果明顯)。編輯/etc/php.ini
文件,添加或修改以下參數:
[opcache]
zend_extension=opcache.so # 啟用OPcache擴展
opcache.enable=1 # 開啟OPcache
opcache.enable_cli=0 # CLI模式下關閉(避免不必要的緩存)
opcache.memory_consumption=128 # OPcache緩存內存大?。∕B,根據服務器內存調整,如128M)
opcache.interned_strings_buffer=8 # 內部字符串緩沖區大?。∕B,默認8M足夠)
opcache.max_accelerated_files=4000 # 緩存的最大腳本文件數(根據應用文件數量調整,如4000)
opcache.revalidate_freq=60 # 腳本更新檢查頻率(秒,默認60秒,生產環境可設為0強制每次檢查)
opcache.fast_shutdown=1 # 快速關閉,提升腳本結束時的內存回收效率
修改后重啟PHP-FPM使配置生效。
數據庫操作是PHP應用的常見性能瓶頸,需通過以下方式優化:
PDO::ATTR_PERSISTENT => true
)。SELECT *
(只查詢所需字段),合理使用索引(如為WHERE、JOIN條件添加索引),合并多次查詢為單條JOIN語句。使用Redis或Memcached緩存頻繁訪問的數據(如熱點數據、查詢結果),降低數據庫壓力:
sudo yum install redis -y # Redis
sudo systemctl start redis && sudo systemctl enable redis
# 或
sudo yum install memcached -y # Memcached
sudo systemctl start memcached && sudo systemctl enable memcached
sudo yum install php-pecl-redis -y # Redis擴展
sudo yum install php-pecl-memcached -y # Memcached擴展
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'hot_data';
if ($redis->exists($key)) {
$data = $redis->get($key); // 從緩存讀取
} else {
$data = $pdo->query("SELECT * FROM hot_table")->fetchAll(PDO::FETCH_ASSOC); // 從數據庫讀取
$redis->set($key, $data, 3600); // 緩存1小時
}
unset()
釋放不再需要的變量(如大數組、數據庫連接),幫助PHP垃圾回收機制回收內存。yield
)以迭代方式處理數據,避免一次性加載大量數據到內存(如處理百萬級數據的循環)。count($array)
放在循環外),減少循環嵌套層數。使用工具監控PHP性能,識別瓶頸并進行針對性調整:
top
、htop
、vmstat
監控服務器CPU、內存、磁盤IO使用情況,判斷是否因資源不足導致PHP性能下降。xdebug
擴展生成性能分析報告(如函數調用時間、內存消耗),識別慢函數或內存泄漏點。sudo systemctl restart php-fpm
、sudo systemctl restart nginx/apache
)使生效。