PHP错误日志不写主因是error_log路径非绝对路径、目录不可写或权限不足,且display_errors与log_errors需同时开启;须用绝对路径配置error_log,重启Web服务,并用error_log()函数实测验证。

PHP开发环境里错误日志不写、写不到、写错地方,是本地调试卡住的最常见原因——不是代码没报错,而是错误被吞了,或者写进了你根本想不到的位置。
php.ini 中 error_log 路径必须是绝对路径且目录可写
很多情况下 error_log 看似配置了,但日志文件始终为空,问题就出在路径上。
-
error_log不接受相对路径(比如./logs/php-error.log或logs/error.log),必须写成完整路径,如C:\php\logs\php-error.log(Windows)或/var/log/php/error.log(Linux/macOS) - 确保该路径所在目录存在,且 PHP 进程有写入权限:Apache 通常以
www-data(Linux)或SYSTEM(Windows)身份运行;PHP-FPM 则看www.conf里的user和group - Windows 下若用 Apache 模块方式运行,
php.ini中的error_log配置只在 Apache 启动时读取一次,改完必须重启 Apache 服务(httpd -k restart),不能只刷新页面
display_errors 和 log_errors 必须同时开启才有效
只开 display_errors = On 只会让错误显示在浏览器里,但不会写日志;只开 log_errors = On 又可能因 error_log 路径失效而静默失败。
- 开发环境建议三者齐开:
display_errors = On、log_errors = On、error_log = /your/absolute/path/error.log - 生产环境必须关掉
display_errors(防止敏感信息泄露),但log_errors和error_log必须保持开启,否则等于没日志 - 注意:如果用了
ini_set()动态设置,它只能影响当前脚本,无法替代php.ini全局配置;某些托管环境(如共享主机)还会禁用ini_set()对关键项的修改
确认错误日志是否真的在写:用 error_log() 函数手动触发验证
别光看 phpinfo() 页面里 error_log 的值,要实测是否真能落盘。
立即学习“PHP免费学习笔记(深入)”;
- 新建一个测试文件
test-log.php,内容为:<?php error_log("【TEST】This is a manual log entry.\n", 3, "C:/php/logs/php-error.log"); echo "Check the log file now."; ?> - 访问该文件,然后立刻去指定路径检查日志文件是否新增了那行内容。若没有,说明路径错、权限不足,或
log_errors = Off在起作用 - 如果用的是 Nginx + PHP-FPM,注意
error_log是 PHP-FPM 自己的日志(php-fpm.conf里的error_log),和 PHP 脚本级的error_log()不是一回事,别混在一起查
最容易被忽略的是:PHP 错误日志和 Web 服务器(Apache/Nginx)错误日志是两套独立系统,error_log 只管 PHP 解析器抛出的错误,而 500 错误、模块加载失败、超时等,得去查 apache2/error.log 或 nginx/error.log。调试时手边至少得开着两个日志文件。



















