TP6升级后报错主因是旧写法不兼容新规则:Route::get仅限app/route.php中返回使用;Db::table()->find()需生成schema缓存;模板url函数需加入白名单;缓存序列化格式变更导致白屏等。
ThinkPHP 升级后报错,大概率不是框架“坏了”,而是旧写法撞上了新规则。直接定位问题比重装更省时间。
Route::get 报 Call to undefined method
TP6 彻底删掉了全局路由函数,
只能在
里用,且必须作为返回值。
检查文件路径是不是
(不是
或其他位置)
必须以
结尾,不能只是写一句
多应用模式下,路由文件要放在对应目录,比如
,并确认该应用已初始化加载
别在控制器或中间件里调用
—— 它根本不是运行时 API
Db::table()->find() 返回 null,但数据明明存在
TP6 默认启用字段缓存严格检查,首次部署没生成 schema 缓存时,查询会跳过字段映射,导致条件失效或类型转换出错。
立刻执行
,强制生成字段缓存
如果表结构常变,可在模型里显式声明
绕过自动探测
确认
中
没被误关(关掉会掩盖字段不匹配问题)
不要依赖
的隐式主键推断,显式写
更稳
模板中 {:url('index/index')} 渲染为空
TP6 默认禁用了模板引擎的函数白名单,
是系统函数,但不在默认允许列表里。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
在
的
配置项中加入
,例如:
更推荐改用命名路由:路由定义里加
,模板中写
别在模板里拼接字符串传给
,如
—— 白名单只认字面量函数名
升级后首页白屏、登录态丢失、配置读取为空
大概率是缓存序列化格式不兼容:旧版用 PHP 原生
,新版默认切到
或
,反序列化旧数据直接失败。
Redis 场景:用
抽样检查值是否以
或
开头;确认后,在
的 Redis 配置里加
File 缓存:直接删掉
下所有子目录(留
和
)
清缓存前务必停服务或切流量,否则新旧格式混写会导致后续更难清理
别注释
—— 只影响当前缓存驱动,其他组件可能还依赖它
最麻烦的不是报错本身,而是错误日志里没显示真实原因——比如
时只看到 500,得先开错误显示才能看到
这类关键线索。
Route::getapp/route.phpapp/route.phproute/route.phpapp/route.phpreturn Route::group(...)Route::get(...)app/api/route.phpRoute::getphp think optimize:schemaprotected $schema = []config/database.php'strict' => trueDb::name('user')->where('id', 1)->find()->where('id', 1)->find()urlconfig/template.php'function''url''function' => ['url', 'date', 'substr']->name('home.index'){:url('home.index')}url(){:url($ctrl.'/'.$act)}serialize()igbinarymsgpackredis-cli KEYS "think:*"a:O:config/cache.php'serializer' => \think\cache\serializer\PhpSerializer::classruntime/cache/index.html.gitignoreextension=igbinary.sodisplay_errors = OffCall to undefined function mysql_connect()