tp6升级后报错主因是旧写法不兼容新规则:route::get仅限app/route.php中返回使用;db::table()->find()需生成schema缓存;模板url函数需加入白名单;缓存序列化格式变更导致白屏等。

ThinkPHP 升级后报错,大概率不是框架“坏了”,而是旧写法撞上了新规则。直接定位问题比重装更省时间。
Route::get 报 Call to undefined method
TP6 彻底删掉了全局路由函数,Route::get 只能在 app/route.php 里用,且必须作为返回值。
- 检查文件路径是不是
app/route.php(不是route/route.php或其他位置) -
app/route.php必须以return Route::group(...)结尾,不能只是写一句Route::get(...) - 多应用模式下,路由文件要放在对应目录,比如
app/api/route.php,并确认该应用已初始化加载 - 别在控制器或中间件里调用
Route::get—— 它根本不是运行时 API
Db::table()->find() 返回 null,但数据明明存在
TP6 默认启用字段缓存严格检查,首次部署没生成 schema 缓存时,查询会跳过字段映射,导致条件失效或类型转换出错。
- 立刻执行
php think optimize:schema,强制生成字段缓存 - 如果表结构常变,可在模型里显式声明
protected $schema = []绕过自动探测 - 确认
config/database.php中'strict' => true没被误关(关掉会掩盖字段不匹配问题) - 不要依赖
Db::name('user')->where('id', 1)->find()的隐式主键推断,显式写->where('id', 1)->find()更稳
模板中 {:url('index/index')} 渲染为空
TP6 默认禁用了模板引擎的函数白名单,url 是系统函数,但不在默认允许列表里。
- 在
config/template.php的'function'配置项中加入'url',例如:'function' => ['url', 'date', 'substr'] - 更推荐改用命名路由:路由定义里加
->name('home.index'),模板中写{:url('home.index')} - 别在模板里拼接字符串传给
url(),如{:url($ctrl.'/'.$act)}—— 白名单只认字面量函数名
升级后首页白屏、登录态丢失、配置读取为空
大概率是缓存序列化格式不兼容:旧版用 PHP 原生 serialize(),新版默认切到 igbinary 或 msgpack,反序列化旧数据直接失败。
- Redis 场景:用
redis-cli KEYS "think:*"抽样检查值是否以a:或O:开头;确认后,在config/cache.php的 Redis 配置里加'serializer' => \think\cache\serializer\PhpSerializer::class - File 缓存:直接删掉
runtime/cache/下所有子目录(留index.html和.gitignore) - 清缓存前务必停服务或切流量,否则新旧格式混写会导致后续更难清理
- 别注释
extension=igbinary.so—— 只影响当前缓存驱动,其他组件可能还依赖它
最麻烦的不是报错本身,而是错误日志里没显示真实原因——比如 display_errors = Off 时只看到 500,得先开错误显示才能看到 Call to undefined function mysql_connect() 这类关键线索。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











