php错误日志默认路径由php.ini中error_log配置项决定,常见为/var/log/php_errors.log;若设为stderr或为空,则错误交由web服务器(如nginx或php-fpm)处理,需查对应服务日志。

PHP 错误日志默认路径在哪
PHP 本身不自动写日志到固定文件,它依赖 error_log 配置项决定错误输出去向。线上环境常见情况是:日志被关掉、写到 /dev/null、或写进 Web 服务器(如 Nginx)的错误流里,导致你 grep -r "PHP Fatal" 找不到任何内容。
先确认当前生效配置:
php -i | grep "error_log\|log_errors"
关键看两行:
-
log_errors => On—— 必须为On,否则任何错误都不记录 -
error_log => /var/log/php_errors.log—— 这才是 PHP 自己写的错误日志路径(注意不是 Apache/Nginx 的 access 或 error log)
如果 error_log 值是 stderr 或空,说明错误直接丢给 Web 服务器处理了,得去查 Web 服务的日志。
立即学习“PHP免费学习笔记(深入)”;
Nginx + PHP-FPM 场景下该查哪个日志
这是最常踩坑的组合。PHP-FPM 本身有独立日志,Nginx 也有自己的错误日志,两者记录内容不同:
- PHP-FPM 的
error_log(如/var/log/php-fpm/www-error.log):记录启动失败、子进程崩溃、opcache加载失败等底层问题 - Nginx 的
error_log(如/var/log/nginx/error.log):记录 502 Bad Gateway、FastCGI 超时、connect refused 等通信问题 - PHP 应用层错误(如
Parse error、Undefined variable)—— 只出现在 PHP 自己的error_log文件里,前提是log_errors=On且路径可写
检查 PHP-FPM 配置里的 www.conf:
tail -n 3 /etc/php/*/fpm/pool.d/www.conf
重点看这几行:
-
catch_workers_output = yes—— 不开的话,var_dump()、echo到 stderr 的内容不会被捕获 -
php_admin_value[error_log] = /var/log/php-fpm/www-php-error.log—— 这会覆盖 php.ini 的全局设置,优先级更高 php_admin_flag[log_errors] = on
日志写不进去?权限和 SELinux 是隐形杀手
即使路径配对了,也常因权限拒绝静默失败。PHP 进程用户(通常是 www-data 或 nginx)必须对日志目录有写权限:
ls -ld /var/log/php-fpm/
如果显示 drwxr-x--- 2 root root,那 www-data 就写不了。修复方式:
chown www-data:www-data /var/log/php-fpm/chmod 755 /var/log/php-fpm/
在 CentOS/RHEL 上还要怀疑 SELinux:
ausearch -m avc -ts recent | grep php
如果看到 denied { write },就说明被拦了。临时放行:
setsebool -P httpd_can_network_connect 1
或者更精准地允许写日志:
setsebool -P httpd_read_user_content 1
怎么让日志包含完整上下文(行号、文件、堆栈)
默认 error_reporting 可能关掉了 Notice 和 Warning,导致低级别问题漏掉;而 display_errors=On 绝对不能在线上开(会把敏感路径暴露给用户)。
安全又实用的组合是:
-
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT—— 记录所有运行时问题 log_errors = Onerror_log = /var/log/php-app-errors.log-
ignore_repeated_errors = Off—— 同一错误连续出现时不合并 -
track_errors = On—— 把最后错误存到$php_errormsg,方便调试时抓取
注意:display_errors 必须为 Off,否则可能触发 XSS 或泄露绝对路径。
改完记得重启服务:systemctl restart php*-fpm nginx,再用 tail -f /var/log/php-app-errors.log 触发一个错误验证是否生效。
线上日志最麻烦的从来不是“找不到”,而是“以为写了其实没权限写”或“写了但被上层服务吞掉”。盯住 php -i 输出和 ps aux | grep php-fpm 看实际运行用户,比盲目查目录快得多。











