ThinkPHP 6.1升级后需手动安装topthink/think-filesystem库并显式注册FilesystemService,Config::pull()须全量替换为Config::get(),路由where规则禁止混用正则与闭包,redis缓存serialize默认值改为false需显式配置。

升级后 think-filesystem 类找不到
ThinkPHP 6.1 移除了对 think-filesystem 的内置依赖,但 6.0 项目里大量代码直接用了 think\Filesystem 或 think\facade\Filesystem,升级后会报 Class 'think\Filesystem' not found 或 Class 'think\facade\Filesystem' not found。
✅ 必须手动安装:
- 运行
composer require topthink/think-filesystem - 检查
config/filesystem.php是否存在,若无则从官方仓库复制一份(6.1 起不再自带默认配置) - 确认
app/provider.php中是否注册了think\service\FilesystemService(6.1 需显式注册)
Config::pull() 报错 Call to undefined method
6.1 废弃了 Config::pull() 方法,这是 6.0 里常用的“提取子配置”写法,比如 Config::pull('database.default')。升级后直接调用会触发 Call to undefined method think\Config::pull()。
✅ 替换方案只有这一种:
立即学习“PHP免费学习笔记(深入)”;
- 全部改为
Config::get('database.default') - 注意:6.1 的
Config::get()支持点号路径,无需再 pull 一层;旧项目里所有pull调用必须全局搜索替换 - 如果原逻辑依赖
pull()返回 null 时的默认行为,需补上三元判断:Config::get('xxx', [])
路由定义中 where 混用正则和闭包报错
6.0 允许在路由规则里这样写:where(['id' => '\d+', 'name' => function ($value) { return strlen($value) > 2; }]);但 6.1 开始强制要求类型统一——要么全正则字符串,要么全闭包,混用会抛出 InvalidArgumentException,提示 “Where rule must be string or Closure”。
✅ 两种改法任选其一:
- 把闭包转成正则:
'name' => '[a-zA-Z0-9_]{3,}' - 或把整个
where改为二维数组格式(6.1 推荐):where([['id', '\d+'], ['name', function ($value) { return strlen($value) > 2; }]]) - 注意:闭包 where 在 6.1 中仍支持,但不能和字符串规则写在同一级数组里
缓存驱动 redis 配置项 serialize 默认值变更导致反序列化失败
6.0.8 的 redis 缓存驱动默认开启 serialize => true,而 6.1 将其默认设为 false。如果你的业务代码依赖缓存自动反序列化对象(比如存了 new User() 然后直接 Cache::get('user') 取出可用对象),升级后取出来就是原始 JSON 字符串或 base64,直接调方法会报 Call to a member function xxx() on string。
✅ 不建议回退默认值,更安全的做法是:
- 明确设置
'serialize' => true(仅限可信数据场景) - 或彻底转向 JSON 方案:存之前
json_encode($data),取之后json_decode($val, true) - 若必须保留
serialize => true,务必同步检查opcache.revalidate_freq = 0,否则热更新时可能反序列化失败
php.ini 加载路径完全一致。哪怕只差一个小版本(比如 CLI 是 7.4.33,FPM 是 7.4.30),都可能导致 composer update 成功但网页 500,错误日志里却只显示空白或 Failed opening required —— 这类问题不查 php --ini 和 php-fpm -v 根本定位不到。



















