必须在入口文件最顶部用define('app_debug', true)硬编码开启,这是所有thinkphp版本唯一无条件识别的调试开关;位置须紧贴

必须在入口文件最顶部用 define('APP_DEBUG', true) 硬编码开启,其他方式(如改 config/app.php 或仅配 .env)都可能失效——这是所有 ThinkPHP 版本(5.x/6.x/8.x)唯一无条件识别的开关。
入口文件必须第一行定义 APP_DEBUG
ThinkPHP 在加载框架前就检查这个常量,位置错、类型错、时机错,整个调试链路(异常堆栈、SQL 日志、Trace 面板)都会静默失效。
-
public/index.php(TP6/8)或index.php(TP5)最顶部,<?php后立即写,不能有任何require、include、echo或空行 - 必须是布尔值:
define('APP_DEBUG', true)—— 写成'true'、1、'1'全部无效 - 多入口场景(如
admin.php、api.php)每个都要单独加这一行 - 加完后必须删掉整个
runtime/目录(含子目录和~runtime.php),否则旧缓存会覆盖新配置
.env 里的 APP_DEBUG=true 为什么经常不生效
.env 是后备方案,优先级低于代码中 define()。一旦入口文件写了 define('APP_DEBUG', ...),.env 里无论写什么都无效。
- 确认
.env文件编码为 UTF-8 无 BOM;等号两侧不能有空格,例如APP_DEBUG = true会读不到 - TP6+ 中,
APP_TRACE=true才能显示右下角 Trace 面板,仅APP_DEBUG=true不够 - 如果用了
think-trace扩展,需确保已安装:composer require topthink/think-trace - Trace 面板只对 HTTP 请求生效;命令行执行(如
php think route:list)需加-v参数才显示完整异常
开了 APP_DEBUG 还是白屏或 500?检查 PHP 底层错误输出
ThinkPHP 调试页面依赖 PHP 自身的错误输出能力。即使 APP_DEBUG = true,若 PHP 屏蔽了错误,你照样看不到堆栈。
- 在入口文件
define('APP_DEBUG', true)后**立即**加两行:ini_set('display_errors', '1');和error_reporting(E_ALL); - Nginx + PHP-FPM 环境下,检查
fastcgi_params是否含fastcgi_intercept_errors on;—— 必须设为off,否则 Nginx 会吞掉 PHP 错误页 - Docker 或共享主机常见问题:镜像默认关了
display_errors,光改代码没用,得进容器改php.ini或启动时注入PHP_INI_SCAN_DIR - CLI 场景(如定时任务)需额外验证:
php -i | grep display_errors,确保 CLI 模式也开启了
真正卡住的往往不是配置本身,而是 runtime 缓存没清干净、Nginx 拦截了错误响应、或者错误发生在框架加载前(比如扩展缺失、语法错误)。每次改完配置,先删 runtime/,再验证 phpinfo() 里的 display_errors 状态,比反复调配置更省时间。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











