ThinkPHP5.1迁移到6.1.5是架构级切换,必须靶向验证PHP环境兼容性、入口与自动加载路径、数据库与模型行为、中间件链路、日志缓存隔离五方面,缺一不可。

ThinkPHP5.1迁移到6.1.5不是版本号微调,而是架构级切换。上线前必须围绕运行基础、路由行为、数据库交互、中间件链路和调试机制这五个关键面做靶向验证,否则容易出现“本地能跑、线上报错”或“功能看似正常、数据逻辑错乱”的隐蔽问题。
一、PHP环境与扩展兼容性必须实测
TP6.1.5要求PHP 7.2+(推荐7.4–8.1),但很多TP5.1老项目长期运行在PHP 7.1甚至更低版本。迁移后若未升级PHP,会直接触发语法错误(如`??`空合并运算符、匿名类、`array_key_first()`等)或扩展缺失报错。 - 确认服务器PHP版本 ≥ 7.2,且已启用以下扩展:`pdo_mysql`、`mbstring`、`fileinfo`、`openssl`、`json`、`curl` - 特别检查`intl`扩展(TP6.1.5部分国际化组件依赖它,TP5.1不强制) - 运行 `php -m | grep -E "(pdo|mbstring|fileinfo)"` 快速核对二、入口文件与自动加载路径需重校准
TP5.1使用 `application/` 目录结构 + `thinkphp/start.php` 启动;TP6.1.5改用 `app/` 目录 + `think` 命令行入口 + PSR-4自动加载。 - 入口文件 `public/index.php` 必须指向 TP6.1.5 的 `thinkphp/base.php`,不能复用TP5.1的启动逻辑 - `composer.json` 中 `autoload` 配置要更新为: ```json "autoload": { "psr-4": { "app\": "app/" } } ``` - 执行 `composer dump-autoload -o` 强制刷新类映射,避免“Class not found”三、数据库与模型层行为差异重点验证
TP6.1.5默认启用严格模式、字段类型强校验,且Query对象方法签名有调整。 - 检查所有 `Db::table()` 调用是否仍有效(建议统一迁移到 `Db::name()`) - 验证 `where()` 条件中字符串键名是否加引号(如 `'status' => 1`,TP5.1可省略引号,TP6.1.5在严格模式下可能报错) - 测试软删除字段(如 `delete_time`)是否被自动识别;TP6.1.5需显式声明 `use SoftDelete;` 并配置 `$deleteTime = 'delete_time';` - 运行一次完整CRUD流程,确认事务提交、批量插入返回值、`findOrEmpty()` 等常用方法行为一致四、中间件与请求生命周期不可跳过实测
TP6.1.5将中间件注册从全局配置移至应用层,且执行顺序更严格。 - 检查 `app/middleware.php` 是否存在并正确注册了鉴权、日志、跨域等中间件 - 验证 `Request` 对象获取方式:TP5.1常用 `input('param')`,TP6.1.5推荐 `request()->param()` 或依赖注入 `Request $request` - 模拟未登录请求,确认中间件是否真正拦截并返回预期响应(如401或跳转),而非静默放行或500崩溃五、日志、缓存与runtime路径必须隔离
TP5.1默认写入 `runtime/log/`,TP6.1.5默认写入 `runtime/log/` 但目录结构和命名规则不同,混用会导致日志覆盖、缓存污染。 - 上线前清空旧 `runtime/` 目录,确保首次启动生成全新结构 - 在 `public/index.php` 顶部添加定义(防部署遗漏): ```php define('RUNTIME_PATH', __DIR__ . '/../runtime/'); ``` - 检查 `.env` 中 `LOG_LEVEL=debug` 和 `CACHE_TYPE=file` 是否生效,访问 `/log` 目录确认日志文件可写、时间戳准确不复杂但容易忽略。



















