跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

ThinkPHP升级后报错_ThinkPHP版本迁移错误修复【汇总】

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
是系统函数,但不在默认允许列表里。 PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载 立即学习 “ PHP免费学习笔记(深入) ”; 在
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()
这类关键线索。

相关文章