温馨提示×

centos php日志为何超大

小樊
42
2026-09-12 00:44:16
栏目: 编程语言

在 CentOS 上,PHP 日志变得超大(几个 G 甚至几十 G)通常不是 PHP 本身的 bug,而是配置或使用方式问题。下面按常见原因从高到低给你梳理,并给出对应解决办法。


一、最常见原因

1. PHP 错误日志级别太低 + 错误很多

php.ini 中:

log_errors = On
error_reporting = E_ALL

如果程序有大量 Notice / Warning / Deprecated,会持续写入日志。

✅ 解决:

error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED

或生产环境:

error_reporting = E_ERROR | E_WARNING

2. 日志没有轮转(logrotate 没生效)

CentOS 默认用 logrotate,但如果:

  • PHP 直接写文件(如 error_log = /var/log/php/php_errors.log
  • 没配置 logrotate
  • 或 php-fpm 没 reload

日志就会一直变大。

✅ 检查:

ls -lh /var/log/php*
cat /etc/logrotate.d/php*

✅ 示例 logrotate:

/var/log/php/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 apache apache
    sharedscripts
    postrotate
        systemctl reload php-fpm > /dev/null 2>&1 || true
    endscript
}

3. PHP-FPM 的慢日志(slow log)开着

www.conf

slowlog = /var/log/php-fpm/slow.log
request_slowlog_timeout = 1s

如果有很多慢请求,日志会爆炸。

✅ 解决:

  • 临时关闭
  • 或调大超时时间
  • 或限制记录频率

4. 把访问日志写进了 PHP 日志

错误示例:

error_log(print_r($_REQUEST, true));

高并发下,日志瞬间爆。

✅ 解决:

  • 不要记录全部请求
  • 用专业日志系统(Monolog / ELK)

5. PHP 在循环中写日志

例如:

while (true) {
    error_log("debug");
}

✅ 解决:

  • 删除调试代码
  • 使用条件日志

6. PHP 异常被反复 catch 又 log

try {
    ...
} catch (Exception $e) {
    error_log($e);
}

在循环中会疯狂写。


7. 日志路径错误导致重复创建

某些程序把日志写到:

/var/log/php_errors.log

但权限不足,PHP 反复尝试写,产生大量错误。


二、快速排查命令

# 查看日志大小
du -sh /var/log/php*

# 看最后内容
tail -n 100 /var/log/php/php_errors.log

# 统计错误类型
grep -oE "PHP (Notice|Warning|Error|Fatal)" /var/log/php/php_errors.log | sort | uniq -c

三、推荐生产环境配置(总结)

log_errors = On
error_log = /var/log/php/php_errors.log
error_reporting = E_ERROR | E_WARNING

并:

  • 开 logrotate
  • 不开 slow log(或仅排查时开)
  • 不记录请求数据

如果你愿意,可以把:

  • PHP 版本
  • php.ini 相关配置
  • 日志路径
  • 日志片段

发出来,我可以直接帮你定位是哪一类问题。

0