PHP错误日志默认不写入指定文件,而是由SAPI层决定:CLI输出到stderr,Apache mod_php写入Apache错误日志,PHP-FPM则可能静默或写入FPM自身日志。

PHP错误日志默认写到哪?
大多数情况下,error_log 不会自动写入你预期的文件——它默认可能输出到 Web 服务器的错误日志(比如 Apache 的 error_log 或 Nginx 的 error.log),也可能直接丢弃(尤其在 CGI/FPM 模式下)。这不是 bug,是 PHP 的设计逻辑:它把日志“出口”交给 SAPI 层决定。
- CLI 模式下,
error_log默认输出到终端(stderr) - Apache mod_php 下,通常写入 Apache 的主错误日志,而非 PHP 自己的文件
- PHP-FPM 下,默认行为更隐蔽:若未显式配置
error_log,错误可能只出现在 FPM 的error.log(不是 PHP 的)或完全静默
怎么让 PHP 把错误写进指定文件?
必须显式设置 error_log 配置项,且路径需被 PHP 进程有写权限。别只改 php.ini 就以为完事——不同运行模式加载的配置文件可能不同。
- 修改
php.ini中的error_log值,例如:error_log = /var/log/php_errors.log - CLI 脚本可用
-d参数覆盖:php -d error_log=/tmp/php_err.log script.php - FPM 用户务必检查对应 pool 的
www.conf,里面也有独立的php_admin_value[error_log]设置项 - 确保目录存在、属主正确(如 www-data 可写),否则日志会静默失败,连 warning 都不报
为什么开了 display_errors = On 却看不到错误?
display_errors 和 error_log 是两回事:display_errors 控制是否输出到页面(开发用),而 error_log 控制是否写入日志文件(生产必需)。线上环境必须关掉 display_errors,否则敏感信息会暴露。
-
display_errors = Off+log_errors = On才是生产标配 -
error_reporting级别必须覆盖你想捕获的错误类型,比如E_ALL & ~E_NOTICE就不会记录 notice - 某些框架(如 Laravel)会接管错误处理,此时即使 PHP 配置正确,错误也可能只进框架日志,要查
storage/logs/而非 PHP 的error_log
常见日志无内容或权限拒绝的排查点
日志文件空着、写不进去、或者只有部分错误,大概率卡在这几个环节。
立即学习“PHP免费学习笔记(深入)”;
- 用
php --ini确认实际加载的是哪个php.ini;FPM 还得查php-fpm.conf和 pool 配置 - 执行
php -i | grep error_log,看输出的error_log路径是否和你设的一致 - 用
ls -l /path/to/error.log检查父目录权限,PHP 进程用户(如www-data)必须对目录有w权限 - 临时加一句
error_log("test", 3, "/tmp/test.log");测试写入能力,绕过配置干扰
error_log 覆盖,以及日志目录的写权限实际归属。











