apache 不直接管理 php 错误日志,需先在 php.ini 中启用 log_errors、指定 error_log 路径并设置 error_reporting,再通过 logrotate 配置 daily 轮转、保留 30 份、压缩归档,并在 postrotate 中用 usr1 通知 php-fpm 重载日志句柄。

Apache 本身不直接管理 PHP 脚本运行时产生的错误日志(如 PHP Fatal error),这部分由 PHP 引擎独立控制。要实现 PHP 日志的轮转,需分两层配置:一是让 PHP 把错误写入**指定文件**(而非屏幕或系统日志),二是用外部工具(如 logrotate)对这个文件做定期切割、压缩与清理。
1. 先确保 PHP 错误日志已启用并落盘
编辑你的 php.ini(路径可通过 php --ini 或 phpinfo() 查看),确认以下三项已设置:
- log_errors = On:必须开启,否则不记录任何错误
-
error_log = /var/log/php_errors.log:指定具体日志文件路径(推荐绝对路径;目录需存在且 Apache/PHP 运行用户可写,如
www-data或apache) - error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT:生产环境建议保留警告和错误,屏蔽过时提示
改完后重启 PHP-FPM 或 Apache:sudo systemctl restart php-fpm(若用 FPM)
或 sudo systemctl restart apache2(若用 mod_php)
2. 用 logrotate 管理 PHP 日志文件
PHP 日志是普通文本文件,完全适配 logrotate。创建配置文件:
sudo nano /etc/logrotate.d/php-errors
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
填入以下内容(按需调整路径和策略):
/var/log/php_errors.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 www-data www-data
sharedscripts
postrotate
if systemctl is-active --quiet php-fpm; then
systemctl kill --signal=USR1 php-fpm 2>/dev/null || true
fi
endscript
}
说明:
- daily:每天轮转一次
-
rotate 30:保留最近 30 个归档(如
php_errors.log.1.gz到php_errors.log.30.gz) -
create 640 www-data www-data:新日志文件权限为
rw-r-----,属主属组匹配 PHP 进程用户 -
postrotate … USR1:通知 PHP-FPM 重新打开日志文件句柄,避免继续往旧文件写(
mod_php不需要此步,但加了也无害)
3. 验证配置是否生效
别等 cron 自动触发,立即手动测试:
- 检查语法:
sudo logrotate -d /etc/logrotate.d/php-errors(-d 表示模拟运行) - 强制执行一次:
sudo logrotate -vf /etc/logrotate.d/php-errors - 查看结果:
ls -la /var/log/php_errors*,应看到原文件变空,同时出现php_errors.log.1或压缩包
如果 PHP 错误仍没写入该文件,请检查 error_log 路径权限、SELinux/firewalld 是否拦截、或应用中是否调用了 error_log() 函数覆盖了全局设置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










