一、调整日志级别,减少不必要的日志记录
根据实际需求调整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使配置生效。