PHP 日志在 CentOS 上“缺失”通常不是单一原因,而是配置、权限、路径、服务方式等多个因素叠加。下面按最常见情况系统排查。
不同方式,日志位置完全不同。
php -v
ps -ef | grep php
常见三种:
| 运行方式 | 日志位置 |
|---|---|
| CLI | php.ini 中 error_log |
| PHP-FPM | /var/log/php-fpm/(或 pool 配置) |
| Apache + mod_php | Apache 的 error_log |
php.ini 未开启错误日志php -i | grep php.ini
检查:
log_errors = On
error_reporting = E_ALL
error_log = /var/log/php/php_errors.log
⚠️ 如果 error_log 没设置,PHP 不会自动生成日志文件
ls -ld /var/log/php
如果不存在:
mkdir -p /var/log/php
chown apache:apache /var/log/php # Apache
# 或
chown nginx:nginx /var/log/php # Nginx + PHP-FPM
chmod 755 /var/log/php
✅ SELinux 是 CentOS 特有坑
查看:
getenforce
如果是 Enforcing,可能需要:
semanage fcontext -a -t httpd_log_t "/var/log/php(/.*)?"
restorecon -Rv /var/log/php
PHP-FPM 不会用 php.ini 的 error_log
查看:
/etc/php-fpm.conf
/etc/php-fpm.d/www.conf
关键配置:
catch_workers_output = yes
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_value[log_errors] = On
重启:
systemctl restart php-fpm
/var/log/httpd/error_log
/var/log/nginx/error.log
很多 PHP 错误其实写在这里。
@file_get_contents('a.txt');
或:
display_errors = Off
✅ 建议调试时:
display_errors = On
log_errors = On
<?php
error_log("PHP log test");
然后:
grep -r "PHP log test" /var/log/
php --ini
或:
php -i | grep "error_log"
| 问题 | 说明 |
|---|---|
| SELinux | 阻止写日志 |
| systemd | journalctl 可能吞日志 |
| 目录权限 | apache/nginx 用户 |
| PHP-FPM | 不用 php.ini 的 error_log |
| 日志轮转 | logrotate 删除旧日志 |
php.ini
log_errors = On
error_reporting = E_ALL
error_log = /var/log/php/php_errors.log
www.conf
catch_workers_output = yes
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_value[log_errors] = On
目录
mkdir -p /var/log/php /var/log/php-fpm
chown nginx:nginx /var/log/php /var/log/php-fpm
如果你愿意,可以告诉我:
我可以直接给你精确配置方案。