PHP的日志级别决定了记录信息的详细程度。生产环境中,无需记录DEBUG级别的详细信息(如变量值、流程跟踪),可将日志级别调整为ERROR或WARNING,仅记录错误和警告信息,大幅减少日志量。
操作步骤:
编辑php.ini文件(路径通常为/etc/php/{version}/fpm/php.ini或/etc/php/{version}/apache2/php.ini),找到error_reporting参数,修改为:
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
log_errors = On
error_log = /var/log/php_errors.log
修改后重启PHP-FPM服务使配置生效:
sudo systemctl restart php{version}-fpm
此方法可直接降低日志写入频率,减少磁盘I/O和存储占用。
当日志文件持续增长时,会占用大量磁盘空间并增加读取负担。使用logrotate工具可实现日志的自动分割、压缩和删除。
操作步骤:
安装logrotate(若未安装):
sudo apt-get install logrotate
创建PHP日志轮转配置文件/etc/logrotate.d/php,添加以下内容:
/var/log/php*.log {
daily # 每天分割一次
rotate 7 # 保留最近7天的日志
compress # 压缩旧日志(节省空间)
missingok # 若日志文件不存在也不报错
notifempty # 若日志为空则不分割
create 640 root adm # 创建新日志文件并设置权限
}
测试配置是否正确:
sudo logrotate -d /etc/logrotate.d/php # 干运行测试
sudo logrotate -f /etc/logrotate.d/php # 强制立即执行
此配置可防止日志文件无限增长,保持日志文件大小可控。
PHP-FPM的进程池配置不当(如pm.max_children设置过大)会导致大量进程同时运行,占用过多内存,进而影响系统性能。需根据服务器内存调整进程数量。
操作步骤:
编辑PHP-FPM配置文件(路径通常为/etc/php/{version}/fpm/pool.d/www.conf),调整以下参数:
pm = dynamic # 使用动态进程管理模式(推荐)
pm.max_children = 20 # 最大进程数(根据服务器内存计算,如1GB内存可设为10-15)
pm.start_servers = 5 # 启动时的进程数
pm.min_spare_servers = 2 # 最小空闲进程数
pm.max_spare_servers = 8 # 最大空闲进程数
pm.max_requests = 1000 # 每个进程处理1000个请求后重启(释放内存)
修改后重启PHP-FPM:
sudo systemctl restart php{version}-fpm
pm.max_requests可防止内存泄漏累积(即使代码无泄漏,长期运行的进程也会占用内存),pm.max_children则避免进程过多导致内存耗尽。
同步日志记录会阻塞PHP进程,增加响应时间。使用异步日志库(如Monolog)可将日志写入操作放入队列,由后台进程处理,降低对主线程的影响。
操作步骤:
安装Monolog库:
composer require monolog/monolog
在代码中配置异步日志处理器(示例):
<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\RotatingFileHandler;
// 创建日志通道
$log = new Logger('app');
// 使用RotatingFileHandler实现日志轮转(替代同步写入)
$handler = new RotatingFileHandler('/var/log/php_async.log', 7, Logger::ERROR);
$log->pushHandler($handler);
// 记录日志
$log->error('This is an error message');
RotatingFileHandler会自动分割日志文件(保留7天),且异步写入减少了对请求处理的影响。
即使是分割后的日志文件,长期积累也会占用大量空间。可通过cron任务定期删除过期日志。
操作步骤:
创建清理脚本/usr/local/bin/clean_php_logs.sh:
#!/bin/bash
# 删除30天前的PHP日志文件
find /var/log/php_*.log.* -mtime +30 -exec rm -f {} \;
赋予脚本执行权限:
sudo chmod +x /usr/local/bin/clean_php_logs.sh
添加cron任务(每天凌晨2点执行):
sudo crontab -e
添加以下内容:
0 2 * * * /usr/local/bin/clean_php_logs.sh
此方法可自动化清理旧日志,避免手动操作。
慢日志可记录执行时间过长的请求,帮助定位导致资源占用的代码或数据库查询。
操作步骤:
开启慢日志记录(在php.ini中配置):
slowlog = /var/log/php_slow.log
request_slowlog_timeout = 5s # 超过5秒的请求视为慢请求
重启PHP-FPM后,慢日志会记录执行时间超过阈值的请求详情(如脚本路径、SQL语句)。
使用工具分析慢日志:
tail -f /var/log/php_slow.log实时查看慢请求;Xdebug生成性能分析报告(需安装Xdebug扩展),或使用PerfOps Slow Log Analyzer等工具解析慢日志,找出耗时最长的函数或查询。通过以上方法,可有效解决Ubuntu PHP日志资源占用过高的问题,提升服务器性能和稳定性。需根据实际场景组合使用这些方法(如生产环境优先配置日志级别和轮转,性能瓶颈时分析慢日志)。