PHP错误不显示主因是php.ini配置错误或未生效;需用php -i确认实际加载的php.ini路径,确保display_errors=On、error_reporting=E_ALL、log_errors=On,并重启PHP-FPM;若仍白屏,须在入口文件首行添加error_reporting(E_ALL)和ini_set相关指令。

phpEnv 里 PHP 错误不显示,基本是因为 php.ini 没改对,或者改了没生效 —— 不是代码问题,也不是 ThinkPHP 或 Composer 的锅。
确认当前生效的 php.ini 文件位置
phpEnv 多版本共存,每个 PHP 版本有自己独立的 php.ini,改错文件等于白改。先运行:
php -i | grep "Loaded Configuration File"
输出类似 Loaded Configuration File => D:\phpEnv\php\php-8.2.12\php.ini,就说明你得去编辑这个路径下的文件,不是别的目录里的同名文件。
常见错误:在 phpEnv 界面点“配置”打开的可能是旧版本或默认模板,实际加载的是命令行 php -v 对应版本的 ini。
立即学习“PHP免费学习笔记(深入)”;
修改 display_errors 和 error_reporting
用文本编辑器打开上一步确认的 php.ini,搜索并确保以下三行未被注释(即前面没有分号 ;),且值正确:
-
display_errors = On(开发阶段必须为On,否则页面空白也不报错) -
error_reporting = E_ALL(不要写成E_ALL & ~E_NOTICE,调试期要看到所有提示) -
log_errors = On(顺便开启日志,方便查ini_set()之前就挂掉的解析错误)
改完保存,必须重启 phpEnv 的 PHP-FPM 服务(或整个 phpEnv),仅刷新浏览器或重载页面无效。Windows 下可在 phpEnv 托盘右键 → “重启 PHP-FPM”;macOS/Linux 则需手动执行 phpenv restart 或杀掉相关进程。
绕过 php.ini 直接在入口文件强制开启
如果仍看不到错误(比如 Fatal error: require(): Failed opening required 'vendor/autoload.php' 这类致命错误依然只显示白屏),说明错误发生在 ini_set() 执行前(如语法错误、require 失败)。这时要在项目入口最顶部加:
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
// 后续再 require thinkphp 入口等
注意两个关键点:
-
display_startup_errors = 1必须设(它控制 PHP 启动阶段错误,如autoload.php找不到这类致命错误) - 这段代码必须是文件第一行,前面不能有任何空格、BOM 或 echo
ThinkPHP 8 的 public/index.php 开头就是 <?php ,适合直接插入;若用了多入口(如 admin.php),每个入口都要加。
常见失效原因和验证点
即使全设对,也可能因以下原因看不到错误:
- 浏览器缓存了 500 响应,尝试用
curl -I http://localhost/xxx看 HTTP 状态码是否真为 500 - 代码里写了
@require或@fopen,@会压制错误,删掉再试 - TP8 默认启用了异常处理器,把错误转成友好的 500 页面,临时注释掉
think\App初始化前的set_exception_handler相关逻辑可暴露原始错误 - phpEnv 的 Nginx/Apache 配置里写了
fastcgi_intercept_errors on,会拦截 PHP 错误页,需关掉
真正卡住的地方,往往不是“怎么开”,而是“以为开了但其实没生效”——每次改动后,用一个故意写错的语句(如 echo $undefined_var;)验证是否真显示 Notice,比看文档更可靠。



















