一、調整日志級別,減少不必要的日志記錄
根據實際需求調整PHP日志級別,避免記錄過多無意義的日志(如DEBUG
、INFO
級別的信息)。例如,在php.ini
中設置:
error_reporting = E_ERROR | E_WARNING | E_PARSE # 僅記錄錯誤、警告和解析錯誤
log_errors = On # 開啟日志記錄
或在PHP-FPM配置文件(如/etc/php-fpm.d/www.conf
)中設置:
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
這樣可以減少日志文件的大小和寫入頻率,提升性能。
二、使用異步日志記錄,避免阻塞主線程
同步日志記錄會阻塞PHP進程,影響腳本執行速度。推薦使用Monolog
等第三方日志庫實現異步寫入。例如:
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\BufferHandler;
// 創建日志通道
$logger = new Logger('app');
// 使用BufferHandler實現批量異步寫入(緩沖100條或1秒后寫入)
$handler = new BufferHandler(new StreamHandler('/var/log/php/app.log', Logger::WARNING), 100, Logger::WARNING);
$logger->pushHandler($handler);
// 記錄日志(不會立即寫入磁盤)
$logger->warning('This is a warning message');
異步日志通過后臺線程處理寫入操作,顯著降低對主線程的影響。
三、配置日志輪轉,防止文件過大
當日志文件過大時,會增加磁盤I/O壓力和查找時間。使用logrotate
工具自動輪換、壓縮和刪除舊日志。例如,創建/etc/logrotate.d/php-fpm
文件:
/var/log/php-fpm/*.log {
daily # 每天輪換
missingok # 忽略缺失文件
rotate 7 # 保留最近7天的日志
compress # 壓縮舊日志(節省空間)
notifempty # 空日志不輪換
create 640 root adm # 新日志文件權限
}
定期執行logrotate
(默認每天一次)即可自動管理日志文件。
四、優化日志存儲方式,提升寫入效率
$logData = [];
for ($i = 0; $i < 100; $i++) {
$logData[] = "Log entry {$i}";
}
file_put_contents('/var/log/php/batch.log', implode(PHP_EOL, $logData) . PHP_EOL, FILE_APPEND);
五、禁用不必要的日志記錄
php.ini
中注釋):; opcache.error_log = /var/log/opcache_errors.log
slow_query_log
)。六、優化PHP及服務器配置
pm.max_children
(子進程數量)、pm.start_servers
(啟動時的子進程數)等參數,避免進程過多導致資源競爭。例如:pm.max_children = 50 # 根據服務器內存調整(每個子進程約消耗10-20MB內存)
pm.start_servers = 10 # 啟動時的子進程數
opcache
緩存編譯后的PHP腳本,減少腳本加載和解析時間(php.ini
中設置):opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
/etc/security/limits.conf
中添加):* soft nofile 4096
* hard nofile 8192
并執行ulimit -n 4096
使配置生效。