PHP 日志在 CentOS 上报错,通常不是“PHP 本身的问题”,而是环境、权限、配置或资源导致的。下面我按最常见原因 → 排查思路 → 解决办法给你系统梳理一下。
PHP 进程(apache / nginx / php-fpm)没有写权限
典型报错
failed to open stream: Permission denied
排查
ls -ld /var/log/php
ls -ld /var/log/httpd
ls -ld /var/log/nginx
解决
chown -R apache:apache /var/log/php
chmod -R 755 /var/log/php
如果是 nginx + php-fpm:
chown -R nginx:nginx /var/log/php
即使权限对,SELinux 也会拦截。
判断
getenforce
如果是 Enforcing,很可能是它。
临时验证
setenforce 0
如果关掉后日志正常,那就是 SELinux。
正确解决(推荐)
semanage fcontext -a -t httpd_log_t "/var/log/php(/.*)?"
restorecon -Rv /var/log/php
php.ini 中日志路径不存在。
检查
php -i | grep error_log
常见配置
error_log = /var/log/php/php_error.log
解决
mkdir -p /var/log/php
touch /var/log/php/php_error.log
chown apache:apache /var/log/php/php_error.log
| 服务 | 默认用户 |
|---|---|
| Apache | apache |
| Nginx | nginx |
| PHP-FPM | www-data / apache / nginx |
查看
ps aux | grep php-fpm
ps aux | grep nginx
ps aux | grep httpd
解决 统一用户,或至少日志目录对该用户可写。
现象
排查
df -h
解决
rm -f 大日志文件
journalctl --vacuum-time=7d
日志被“关掉”了。
php.ini
error_reporting = E_ALL
log_errors = On
display_errors = Off
重载
systemctl restart php-fpm
systemctl restart httpd # 或 nginx
tail -f /var/log/php/php_error.log
tail -f /var/log/httpd/error_log
tail -f /var/log/nginx/error.log
journalctl -xe
ausearch -m avc -ts recent
| 版本 | 注意 |
|---|---|
| CentOS 7 | SELinux 严格 |
| CentOS 8 | 默认用 php-fpm |
| CentOS Stream | 日志路径可能变化 |
你可以直接把报错原文贴出来,比如:
我可以直接告诉你哪一行配置要改 ✅