立刻看到真实错误需在入口文件顶部加error_reporting(E_ALL);ini_set('display_errors','1');,且须置于任何输出前;Parse Error需用php -l检查;线上应改用error_log定位。

PHP报错被屏蔽了,怎么立刻看到真实错误?
默认情况下,PHP可能把错误输出到日志而非页面,或者被 error_reporting 和 display_errors 关掉了——这在上线环境常见,但调试时极其碍事。最直接的办法是临时绕过配置,在入口文件(如 index.php)顶部加两行:
error_reporting(E_ALL);ini_set('display_errors', '1');
注意:这两行必须放在任何输出(包括空格、BOM、echo)之前,否则会触发「Headers already sent」警告。如果用了 Composer 自动加载或框架引导文件,要插在它们之前,否则可能无效。
为什么 set_error_handler 不显示 Parse Error?
set_error_handler() 捕获不到语法解析阶段的错误(比如漏括号、错用 = 而非 ==),因为此时脚本根本没开始执行。这类错误只能靠开启 display_errors 或查 error_log 文件定位。
临时应急时,可运行命令快速验证:
立即学习“PHP免费学习笔记(深入)”;
php -l your_script.php
它只做语法检查,不执行,返回 Errors parsing 就说明有 Parse Error,且会标出行号。
线上不敢开 display_errors,但又需要看错在哪?
这时候别硬开页面输出,改用日志+快速定位:
- 确保
log_errors = On(php.ini 中) - 临时指定日志路径:
ini_set('error_log', '/tmp/php-debug.log'); - 出错后立刻
tail -f /tmp/php-debug.log监听
注意:Web 服务器用户(如 www-data)必须对目标日志目录有写权限,否则日志写不进去,看起来像“没报错”。另外,某些 SaaS 环境(如部分共享主机)禁用 ini_set(),这时只能靠修改 .user.ini 或联系运维。
用 Xdebug 临时启用太重?试试 php -d 快速启动
不需要改 php.ini,也不用重启服务,一条命令即可带调试参数跑单个脚本:
php -d display_errors=1 -d error_reporting=E_ALL your_script.php
它优先级高于 php.ini,适合排查 CLI 场景或简单 Web 入口。但注意:-d 不能覆盖所有配置(比如 opcache.enable 就不行),且对已加载的扩展(如某些 Zend 扩展)无影响。
真正棘手的是错误发生在 include/require 链深层,或被 @ 运算符压制——这种时候得全局搜索 @ 并删掉,再配合上述方法才看得见真错误。











