ThinkPHP8上线AI服务器必须关闭调试模式并规范日志:第一步curl检查响应头无X-Powered-By: ThinkPHP;第二步runtime/log下应有error/等子目录;第三步App::isDebug()返回false;入口文件define('APP_DEBUG', false)须置顶且唯一,清空runtime缓存;同时禁用trace、限制log.level不含sql、数据库log.enable=false、PHP display_errors=Off。

ThinkPHP8项目上线AI服务器时,必须关闭调试模式并规范日志行为,否则会泄露数据库结构、SQL语句、堆栈路径等敏感信息,还可能被FastAPI等上游服务触发调试中间件输出HTML片段。
确认调试模式是否真正关闭
第一步:访问任意API接口,用curl检查响应头:curl -I http://your-domain/v1/health;若返回头中仍含X-Powered-By: ThinkPHP,说明APP_DEBUG未真正关闭。
第二步:进入runtime/log/目录,执行ls -la;若该目录为空或只有.gitignore,且无sql/或error/子目录生成,大概率debug仍开启。
第三步:在命令行运行php -r "echo \think\App::isDebug() ? 'true' : 'false';";输出true即表示框架层仍认为处于调试状态,需立即排查入口文件。
立即学习“PHP免费学习笔记(深入)”;
入口文件强制关闭APP_DEBUG(最可靠方式)
打开public/index.php,定位到PHP标签<?php 后的第一行有效代码;【必须确保该行是define('APP_DEBUG', false);,且前面无空行、BOM、注释或echo输出】。
删掉所有其他位置的define('APP_DEBUG', ...)语句——包括admin/index.php等多入口文件、命令行入口think脚本、以及任何控制器或中间件里的动态定义。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
清空runtime/全目录:rm -rf runtime/*;这一步不可跳过,否则旧缓存会导致配置不生效。
禁用Trace面板与调试输出
方法一:修改config/app.php,将'app_debug' => false和'trace' => false同时设为false;注意app_debug只是辅助开关,主控权仍在入口文件的APP_DEBUG常量。
方法二:直接禁用Trace驱动,在config/trace.php中把'type'值改为false或空字符串;这能彻底阻止右下角调试窗渲染,避免残留JS注入风险。
方法三:创建空Trace类app/common/trace/NullTrace.php,内容仅一行<?php return '';,再在config/trace.php中指向其命名空间;适合需要保留trace配置结构但强制静默的场景。
生产环境日志策略配置
编辑config/log.php,将'level'数组明确限定为['error', 'notice'];【绝对不要包含'sql',否则即使APP_DEBUG=false,只要log.level含sql且数据库log.enable=true,SQL仍会被记录】。
检查config/database.php中数据库连接配置,确认'log' => ['enable' => false]已显式设置;TP8默认开启,必须手动关闭才能阻断SQL日志写入路径。
关闭PHP错误显示:在php.ini中设display_errors = Off、log_errors = On、error_log = /var/log/php-error.log;这确保错误进系统日志而非响应体。


















