PHP错误日志需同时启用log_errors=On和设置有效error_log路径,确认CLI与Web环境各自生效的php.ini位置,重启对应服务并关闭display_errors以保障安全。

PHP 安装后默认通常不记录错误日志,error_log 为空或指向 /dev/null,导致线上问题无法排查。必须手动修改 php.ini 并确认生效位置,否则改了也白改。
怎么确认当前生效的 php.ini 文件路径
很多人直接去改 /etc/php/8.1/apache2/php.ini 或 C:\php\php.ini,但 PHP CLI 和 Web(如 Apache/Nginx)可能加载不同配置文件,且重启服务后也不一定生效。
- 运行
php --ini查看 CLI 模式下加载的配置路径 - 在 Web 环境中新建
info.php,内容为 ,访问后搜索Loaded Configuration File行 - 注意:Nginx + PHP-FPM 场景下,要查的是
php-fpm进程加载的php.ini,不是 Nginx 的配置
error_log 和 log_errors 必须同时启用才写日志
log_errors = Off 是默认值,即使设置了 error_log = /var/log/php_errors.log,错误也不会写入——这是最常被忽略的组合开关。
- 确保
log_errors = On - 设置绝对路径的
error_log = /var/log/php_errors.log(Linux)或error_log = C:\php\logs\php_errors.log(Windows) - 目录必须存在,且 PHP 进程用户(如
www-data、nginx或IIS_IUSRS)有写权限 - 避免用
error_log = syslog除非你真在用 rsyslog —— 它不生成可读文件,新手容易误判“没日志”
display_errors 要关掉,尤其在线上环境
display_errors = On 会把错误直接输出到浏览器,暴露路径、变量、数据库结构,属于严重安全隐患。
立即学习“PHP免费学习笔记(深入)”;
- 开发环境可临时开:
display_errors = On+error_reporting = E_ALL - 生产环境必须设为:
display_errors = Off,只靠error_log记录 - 若用了框架(如 Laravel、ThinkPHP),它们有自己的日志通道,此时
error_log只捕获 PHP 解析级错误(如语法错、内存溢出),业务异常走框架日志
改完 php.ini 后必须重启对应服务
PHP 配置不是热加载。改完不重启,等于没改。
- Apache:执行
sudo systemctl restart apache2(Debian/Ubuntu)或httpd -k restart(CentOS) - PHP-FPM:执行
sudo systemctl restart php8.1-fpm(版本号按实际替换) - CLI 模式无需重启,但需确认你测试时用的是同一 PHP 二进制(
which php) - 验证是否生效:写一段触发 Notice 的代码(如
echo $undefined_var;),然后tail -f /var/log/php_errors.log看是否追加内容
真正卡住人的从来不是“怎么写配置”,而是搞不清哪个 php.ini 在起作用、权限没给对、或者忘了关 display_errors 就以为“日志没出来”。多查一次 phpinfo(),比重装 PHP 更快解决问题。











