php错误不显示主因是display_errors关闭、error_reporting级别过低或被@抑制;须通过phpinfo()确认真实php.ini路径,检查cli与web环境配置差异,并排除@符、解析错误及fpm覆盖等干扰。

PHP错误不显示,基本就是display_errors关了、error_reporting级别太低,或者被@运算符压制了——先查这三项,90%的问题当场解决。
查当前生效的php.ini路径和实际配置值
很多问题出在改错了文件:你以为改的是正在用的php.ini,其实PHP加载的是另一个。别猜,直接看:
- 新建一个
info.php,内容只有<?php phpinfo(); ?>,浏览器访问它,搜索“Loaded Configuration File”——那一行才是真实生效的php.ini路径 - 在命令行执行
php -i | grep "error_reporting\|display_errors\|log_errors",能立刻看到运行时的实际值,比翻配置文件更准 - 注意:CLI(命令行)和Web服务器(如Nginx+PHP-FPM)可能加载不同的
php.ini,调试Web脚本时,必须看Web环境下的phpinfo()输出
display_errors = On但页面还是空白?检查@错误抑制符和解析错误
display_errors = On只对运行时错误有效;@会临时屏蔽错误输出,而Parse error、Fatal error这类解析或启动阶段错误,根本不会走到ini_set()或脚本逻辑里。
- 打开
php.ini,确认display_errors = On且**没被.htaccess或php-fpm.conf覆盖**(比如Nginx+PHP-FPM环境下,还要在pool配置里加php_flag[display_errors] = on) - 检查代码里有没有大量
@file_get_contents(...)这类写法——@会让错误完全静默,连日志都不记(除非log_errors = On且没被@干扰) - 如果是语法错误导致白屏,
display_errors也救不了你;此时只能靠php -l your_script.php做语法检查,或看error_log文件
用ini_set()临时开启,但只对部分错误生效
ini_set('display_errors', '1')必须放在脚本最开头、任何输出之前,但它无法捕获ini_set()执行前就发生的错误。
- 以下错误永远看不到提示:
Parse error(少括号、分号)、Class not found(autoloader未注册前)、require_once路径错导致的致命错误 - 正确写法是三句一起上,且顺序不能错:
ini_set('error_reporting', E_ALL); ini_set('display_errors', '1'); ini_set('log_errors', '1'); - 如果用了
error_log指定路径,确保该目录存在、Web服务器用户(如www-data)有写权限,否则日志会静默失败
error_reporting设成E_ALL还是看不到Notice?确认没被整数覆盖
有些老配置或.htaccess里写的是php_value error_reporting 32767(PHP 7.4+中E_ALL的整数值),但升级PHP后这个数字可能失效;硬编码整数极易出兼容问题。
- 永远优先用常量:
error_reporting(E_ALL)或ini_set('error_reporting', E_ALL),不要用32767或-1 -
E_ALL ^ E_NOTICE这种位运算写法没问题,但要确保没被其他地方的ini_set()或配置再次覆盖 - 生产环境切记:关闭
display_errors,只开log_errors,否则错误信息可能泄露路径、数据库结构等敏感细节
真正容易被忽略的是:Nginx + PHP-FPM 架构下,php.ini里的display_errors可能被php-fpm.d/www.conf里的php_flag[display_errors] = off强行覆盖,而且后者优先级更高——调了半天php.ini,结果全白搭。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











