在 CentOS 上,PHP 日志不写入通常不是代码问题,而是权限、路径或配置的问题。下面按最常见原因 → 排查步骤给你一个完整清单。
php --ini
或
php -i | grep "Loaded Configuration File"
error_log = /var/log/php_errors.log
但目录权限不足。
ls -ld /var/log
ls -l /var/log/php_errors.log
touch /var/log/php_errors.log
chown apache:apache /var/log/php_errors.log # CentOS 7
# 或
chown nginx:nginx /var/log/php_errors.log # nginx
chmod 644 /var/log/php_errors.log
Web 服务用户
apacheapache 或 nginx(取决于 php-fpm 配置)查看:
ps aux | grep php-fpm
SELinux 是 CentOS 日志写不进的头号元凶。
getenforce
如果是 Enforcing,继续。
tail -f /var/log/audit/audit.log
或
grep php /var/log/audit/audit.log
setenforce 0
如果日志立刻能写了,说明就是 SELinux。
semanage fcontext -a -t httpd_log_t "/var/log/php_errors.log"
restorecon -v /var/log/php_errors.log
或允许 httpd 写日志:
setsebool -P httpd_can_network_connect 1
log_errors = On
error_log = /var/log/php_errors.log
检查是否:
修改后必须重启:
systemctl restart php-fpm
systemctl restart httpd # 或 nginx
很多人只看 php.ini,但 PHP-FPM 有自己的日志。
vim /etc/php-fpm.conf
# 或
vim /etc/php-fpm.d/www.conf
关键项:
catch_workers_output = yes
php_admin_value[error_log] = /var/log/php-fpm-error.log
否则 PHP 错误不会输出到日志。
error_reporting = E_ALL
display_errors = Off
log_errors = On
如果设置成:
error_reporting = E_NONE
那就什么都不会记录。
fastcgi_param PHP_VALUE "log_errors=On";
或者 PHP 错误被重定向到:
error_log /var/log/nginx/error.log;
✅ 1. php.ini 是否开启日志
✅ 2. 日志文件路径是否存在
✅ 3. 目录和文件权限是否正确
✅ 4. SELinux 是否拦截
✅ 5. 是否重启 php-fpm / web 服务
✅ 6. 是否查看的是正确的日志文件
<?php
error_log("PHP log test");
ini_set('error_log', '/var/log/php_test.log');
error_log('test');
你可以直接贴出:
php -i | grep error_logls -Z(SELinux 上下文)我可以 精确到哪一行配置打勾就能解决 ✅