在 CentOS 上 PHP 日志写入变慢 / 请求因日志变慢,通常不是 PHP 本身的问题,而是日志方式、磁盘、配置或系统资源导致的。下面按常见原因逐一说明,并给出排查与解决办法。
PHP 日志(如 error_log、php-fpm.log)是同步写磁盘的:
✅ 排查:
iostat -x 1
或
top
看 %wa(IO 等待)是否很高
✅ 解决:
syslog 或 journalderror_reporting = E_ALL
display_errors = On
log_errors = On
每请求都写大量日志,性能直接下降。
✅ 正确生产配置:
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
log_errors = On
display_errors = Off
slowlog = /var/log/php-fpm/slow.log
request_slowlog_timeout = 1s
如果很多请求超过 1 秒,会频繁写慢日志,导致:
✅ 建议:
例如:
/var/log/php-fpm/error.log → 2GB
✅ 检查:
ls -lh /var/log/php-fpm/
✅ 解决:
logrotateCentOS 默认开启 SELinux,日志目录权限不对时会:
✅ 排查:
getenforce
✅ 临时验证:
setenforce 0
✅ 正确做法: 给日志目录正确 context:
semanage fcontext -a -t httpd_log_t "/var/log/php-fpm(/.*)?"
restorecon -Rv /var/log/php-fpm
✅ 建议:
tmpfs(仅调试)日志慢只是“表象”,真正原因是:
✅ 查看:
php-fpm status
✅ 关注:
error_log() 大量写文件代码中:
error_log("debug info");
高并发下非常慢。
✅ 建议:
# 1. 磁盘 IO
iostat -x 1
# 2. PHP 日志大小
du -sh /var/log/php-fpm/*
# 3. PHP 配置
php -i | grep error_log
php -i | grep slowlog
# 4. SELinux
getenforce
# 5. php-fpm 状态
systemctl status php-fpm
CentOS 上 PHP 日志慢,90% 是“日志同步写磁盘 + 日志过多 + IO 瓶颈”导致的。
如果你愿意,可以告诉我:
我可以直接帮你给出最优配置。