php日志轮转需借助logrotate等外部工具实现:先在php.ini中固定error_log路径并设权限,再配置/etc/logrotate.d/php-errors定义轮转策略,含daily、rotate 30、compress及postrotate通知php-fpm重载日志;cli场景可用systemd-journald替代。

PHP 本身不直接提供日志轮转功能,日志轮转通常由 Web 服务器(如 Apache、Nginx)或系统级工具(如 logrotate)控制。但你可以通过合理配置 PHP 的错误日志输出方式 + 外部轮转机制来实现安全、可控的日志归档。关键在于:让 PHP 把错误日志写入一个固定路径的文件,并交由 logrotate 管理。
确保 PHP 错误日志路径固定且可写
在 php.ini 中明确指定日志路径,避免使用动态路径或 stdout:
- 设置 error_log = /var/log/php/error.log(推荐绝对路径)
- 关闭 log_errors = On
- 建议同时设 display_errors = Off(生产环境禁用页面显示错误)
- 确认 Web 进程用户(如 www-data、nginx、apache)对该目录有写权限:
sudo chown -R www-data:www-data /var/log/php/ && sudo chmod 755 /var/log/php/
配置 logrotate 管理 PHP 日志文件
新建配置文件(如 /etc/logrotate.d/php-errors),内容示例:
- /var/log/php/error.log {
- daily — 每天轮转一次
- missingok — 日志不存在也不报错
- rotate 30 — 保留最近 30 个归档文件
- compress — 使用 gzip 压缩旧日志
- delaycompress — 延迟压缩(最新一轮不压,便于排查)
- notifempty — 空文件不轮转
- create 644 www-data www-data — 轮转后新建日志权限与属主
- sharedscripts
- postrotate
- if [ -f /var/run/php/php8.1-fpm.pid ]; then
- kill -USR1 `cat /var/run/php/php8.1-fpm.pid`
- fi
- endscript
- }
⚠️ 注意:postrotate 中的 kill -USR1 是通知 PHP-FPM 重新打开日志文件(避免句柄仍指向旧文件)。FPM 版本不同,pid 路径可能为 /var/run/php-fpm.pid 或 /run/php/php*-fpm.pid,请按实际调整。
验证与调试轮转是否生效
手动触发并检查行为是否符合预期:
- 运行 sudo logrotate -d /etc/logrotate.d/php-errors(-d 表示调试模式,只打印不执行)
- 强制执行一次:sudo logrotate -f /etc/logrotate.d/php-errors
- 检查:ls -la /var/log/php/ 是否生成 error.log.1 或 error.log.1.gz
- 确认新日志继续写入 error.log:tail -f /var/log/php/error.log
- 查看 logrotate 记录:sudo cat /var/lib/logrotate/status | grep php
替代方案:使用 systemd-journald(仅限 PHP CLI 场景)
若 PHP 脚本以 systemd service 方式运行(非 Web),可跳过文件日志,直接利用 journal:
- 在 service 文件中设 StandardError=journal 和 StandardOutput=journal
- 通过 journalctl -u your-php-service --since "2 days ago" 查看
- 日志自动受 journald 的 SystemMaxUse、MaxRetentionSec 等参数轮转控制
这种方式免去文件管理,适合后台任务,但不适用于 Apache/Nginx 下的 Web 请求错误日志。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











