APP_DEBUG必须设为false,否则会暴露错误堆栈、数据库密码、控制器路径等敏感信息;需在.env中显式设置并检查config/app.php中无硬编码debug=>true。

为什么 APP_DEBUG 必须设为 false
生产环境开启 APP_DEBUG 等于把错误堆栈、数据库配置、路径信息直接暴露给访问者,常见后果包括:泄露 .env 中的数据库密码、显示完整控制器路径导致路由结构被反推、触发异常时返回敏感服务器信息。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
-
APP_DEBUG必须在.env中显式设为false,不能依赖默认值或注释掉该行(ThinkPHP 6+ 默认未定义时会 fallback 到true) - 检查
config/app.php中是否硬编码了'debug' => true,该配置优先级高于.env,需一并改掉 - 部署后用 curl 测试:访问一个不存在的路由,确认返回的是统一 404 页面,而非带
ClassNotFoundException的调试页面
运行模式选 APP_MODE = 'prod' 还是留空?
ThinkPHP 的 APP_MODE 实际影响极小,6.x 版本中它仅用于初始化时加载对应目录下的配置文件(如 config/prod/),但绝大多数项目并不创建这种目录结构;留空时默认走 config/ 主目录,更稳定。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 除非你主动建立了
config/prod/并在里面放了覆盖配置,否则不要设APP_MODE—— 它不会自动启用缓存、压缩或安全加固 - 真正起作用的是
APP_ENV(决定日志通道、缓存驱动等)和APP_DEBUG(开关调试层),这两个才需要明确配置 - 若误设
APP_MODE = 'prod'但没建对应目录,系统会静默忽略,不报错也不警告,容易让人误以为“已生效”
关闭调试后,错误日志去哪了?怎么查?
关闭 APP_DEBUG 后,所有错误不再输出到页面,而是写入日志文件,默认路径是 runtime/log/ 下按日期生成的 YYYY-MM-DD.log。但很多人部署后发现日志为空,问题往往出在权限或配置上。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 确认
runtime/目录可写(Web 用户如www-data或nginx必须有写权限),否则日志直接丢弃,且无提示 - 检查
config/log.php中'default'是否为'file',以及'channels.file.path'是否指向有效路径(注意末尾斜杠) - 手动触发一个错误(如访问
/index.php?s=abc让路由失败),再立刻查看runtime/log/下最新日志文件,确认是否有[error]行
app.php 里哪些配置项在生产环境必须核对?
除了 debug,app.php 中几个关键项在生产环境不改会导致性能或安全问题:比如缓存驱动未切到 redis 或 apcu,模板编译未关闭,或者跨域配置残留调试用的通配符。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
-
'app_status'设为'production'(虽不影响逻辑,但部分扩展会读取它做行为区分) -
'template.cache_enable'必须为true,否则每次请求都重新编译模板,CPU 拉满 -
'middleware'数组中移除本地调试中间件(如Debugbar、TraceDebug),它们在生产环境会拖慢响应并暴露信息 -
'default_return_type'建议设为'json'(如果全站 API 化),避免意外输出 HTML 混淆前端解析



















