ThinkPHP 3.2.2 直接升级至 6.0.16 高风险,须分阶段推进:先环境隔离与依赖重建,再目录结构与命名空间映射,接着路由/数据库/模板/配置等核心行为逐项对齐,最后通过迁移工具和最小回归测试闭环验证。

从 ThinkPHP 3.2.2 直接升级到 6.0.16 是高风险操作,不能靠替换文件或简单改命名空间完成。必须分阶段推进,重点是结构解耦、契约对齐、行为验证。中间建议先过渡到 TP5.1(若业务允许),再升至 TP6;若跳过 TP5,则需更严格的隔离测试和人工核验。
第一步:环境与依赖隔离准备
避免新旧逻辑混杂导致隐性冲突:
- 新建独立分支(如 upgrade/tp6-step1),不复用原开发分支
- 升级 PHP 版本至 7.4+(TP6.0.16 最低要求),确认 mbstring、openssl、pdo_mysql、json、fileinfo 全部启用
- 删除原 ThinkPHP/Library/Think 和 Runtime 目录,清空 composer.lock,重装依赖:
composer create-project topthink/think=6.0.16 --no-dev - 将原项目代码按模块(如 Home/Controller、Common/Model)复制进新框架的 app/ 目录下,暂不运行,仅作代码池
第二步:目录与命名空间映射重构
TP6 彻底废弃 TP3 的扁平化结构,必须显式重映射:
- 原 Application/Home/Controller/IndexController.class.php → 移至 app/index/controller/Index.php,类名改为 Index,命名空间改为 app\index\controller
- 原 Application/Common/Model/UserModel.class.php → 移至 app/index/model/User.php,继承 think\Model(注意:TP6 中要写 use think\Model as BaseModel; 并让模型类 extend BaseModel)
- 原 Conf/config.php 拆解后扁平放入 config/ 根目录:database.php、cache.php、app.php 等;自定义配置如 api.php 需在启动时显式加载:
Config::load('api', 'api'); - 入口文件 public/index.php 必须替换为 TP6 标准引导方式,删掉所有 TP3 的 define 和 require 引导逻辑
第三步:核心行为逐项对齐
TP3 到 TP6 不只是语法变化,更是运行契约变更。以下关键点必须人工校验,不可依赖 AI 自动转换:
立即学习“PHP免费学习笔记(深入)”;
-
路由:删除所有 Conf/routes.php 或控制器内硬编码路径;全部重写到 app/route.php,返回 RuleGroup 实例,例如:
return Route::get('user/:id', [\app\controller\User::class, 'read']); -
数据库:原 M('User')->where(...)->select() 改为 Db::name('user')->where(...)->select();首次部署后立即执行:
php think optimize:schema,否则 find() 可能返回 null - 模板渲染:原 display('index') 改为 view('index');{:U('User/add')} 不再可用,改用命名路由或 url('user/add')(需确保 function 在模板白名单中)
- 配置读取:原 C('DB_HOST') 改为 Config::get('database.hostname');注意大小写——type => 'mysql'(小写),大写会报错 Driver [MySQL] not supported
第四步:迁移与验证闭环
用可回滚、可比对的方式管理结构变更,并建立最小验证集:
- 安装迁移工具:
composer require topthink/think-migration:^3.0(TP6.0.16 对应 3.x),并在 config/console.php 的 'commands' 数组中加入 '\think\migration\Command::class' - 执行 php think migrate:install 初始化元数据表,再用 php think migrate:create InitUserTable 生成迁移文件,把原建表 SQL 转为 up()/down() 链式调用(禁止手写 SQL 或漏写 down())
- 编写最小回归测试:覆盖登录、列表查询、表单提交三个主路径;每个测试包含“前置数据插入→接口调用→断言响应→清理”,不依赖 GUI 或 session 持久化
- 上线前必做三清:runtime/ 目录、vendor/ 目录、composer.lock 文件,再执行 composer install --no-dev && composer dump-autoload -o



















