必须同时设置 error_reporting(E_ALL) 和 display_errors=1 才能在页面显示错误,仅设前者无效;还需开启 display_startup_errors 捕获启动期错误,并在线上关闭 display_errors、启用 log_errors 写入安全路径日志。

PHP 默认不显示错误,必须手动开启 error_reporting 并配合 display_errors 才能在页面看到报错信息。
为什么设置了 error_reporting(E_ALL) 还是看不到错误?
常见原因是只改了 PHP 代码里的 error_reporting(),但没开 display_errors —— 它控制“是否输出到浏览器”,而 error_reporting 只控制“报哪些错”。两者缺一不可。
-
error_reporting(E_ALL)是告诉 PHP:“所有错误都记录下来” -
ini_set('display_errors', '1')才是告诉 PHP:“把记录下来的错,直接打在网页上” - 如果用的是 CLI(命令行),
display_errors默认是 off,需显式开启;Web 环境下也常被 php.ini 关闭 - 某些服务器(如 Nginx + PHP-FPM)还受
php_admin_flag display_errors off限制,此时代码里ini_set会失效
开发环境推荐的三步开启法
别只靠一行 error_reporting,要组合生效:
- 在入口文件(如
index.php)最开头加:error_reporting(E_ALL); ini_set('display_errors', '1'); ini_set('display_startup_errors', '1'); -
display_startup_errors很关键:它能捕获require、扩展加载失败等早期错误,否则这些错直接 500 却不提示 - 确保没有其他地方调用
ini_set('display_errors', '0')或error_reporting(0)覆盖掉设置
线上环境绝对不能开 display_errors
暴露错误信息等于暴露路径、变量名、数据库结构,甚至可能触发敏感逻辑泄露。线上只做两件事:
立即学习“PHP免费学习笔记(深入)”;
- 关闭
display_errors(设为'0'或Off) - 开启
log_errors并配好error_log路径,让错误写进日志文件 - 注意:
error_log路径要可写,且不能放在 Web 可访问目录下(比如别设成/var/www/html/error.log) - 如果用了 Laravel、ThinkPHP 等框架,它们通常自带错误处理器,此时直接关
display_errors就行,框架会接管并渲染友好页面
最容易被忽略的是 display_startup_errors 和 log_errors 的权限/路径配置——前者不开,连 extension=xxx.so 加载失败都看不见;后者路径错了,日志就静默丢弃,你以为没错误,其实全漏了。



















