PHP数据库迁移应选Phinx而非自写脚本,因其独立、支持回滚与环境隔离;配置须用YAML格式的phinx.yml,环境名小写,MySQL host本地用localhost、Docker用容器名;Laravel Migrations可单独使用但需手动构建Migrator并注意功能限制。

PHP 本身没有内置数据库迁移功能,必须依赖外部工具;主流且生产可用的选择只有 Phinx 和 Laravel Migrations(即使你不用 Laravel 框架,也能单独用它的迁移组件)。其他轻量方案(如手写 SQL 脚本 + 版本号文件)容易在团队协作或回滚时出问题,不建议用于中大型项目。
为什么选 Phinx 而不是自己写 migrate 脚本
Phinx 是专为 PHP 设计的独立迁移工具,不绑定框架,配置简单,支持回滚、状态检查、环境隔离。它用 PHP 类定义迁移逻辑,比纯 SQL 更易维护和测试。
- 迁移文件是 PHP 类,可复用业务逻辑(比如插入默认用户时调用
User::create()) - 自动记录
phinxlog表,明确知道哪些迁移已执行、哪些失败 - 支持
up()/down()分离,回滚真正可靠(不像某些脚本只靠“反向 SQL”,字段重命名或索引删除根本不可逆) - 命令行直接生成、执行、回退:
php vendor/bin/phinx create AddUsersTable、php vendor/bin/phinx migrate、php vendor/bin/phinx rollback
Phinx 配置常见错误:database 配置不生效
很多人按文档写好 phinx.php,但执行 migrate 时仍连错库或报 Connection refused —— 根本原因是 Phinx 默认只读 phinx.yml,不认 PHP 格式配置文件,除非显式指定。
- 必须用 YAML 格式,文件名固定为
phinx.yml(不能是phinx.php或config/phinx.php) - 环境字段名必须小写:
production、development,不能写成Production;Phinx 不做大小写容错 - MySQL 的
host别写127.0.0.1当本地开发用,改用localhost,否则可能因 socket 连接策略失败 - 如果用 Docker,
host应填容器名(如mysql),不是localhost—— 容器内 localhost 指自身,不是宿主机
Laravel Migrations 在非 Laravel 项目中怎么用
可以,但要手动补全执行上下文。Laravel 的 php artisan migrate 依赖服务容器和数据库连接管理,剥离后需用 Illuminate\Database\Migrations\Migrator 手动驱动。
立即学习“PHP免费学习笔记(深入)”;
- 先通过 Composer 安装:
composer require illuminate/database - 手动创建 PDO 连接并注入到
ConnectionFactory,再构建Migrator实例 - 迁移文件仍放
database/migrations/,但类必须继承Illuminate\Database\Migrations\Migration,且方法签名严格为up(Blueprint $blueprint) - 关键限制:不支持
artisan migrate:rollback --step=2这类高级指令,得自己解析migrations表查最近 N 条记录再逐条 down
真正难的不是跑通第一条迁移,而是处理已有线上库的初始同步、跨环境字段类型差异(比如 MySQL 5.7 的 json 字段在旧版里只能用 text)、以及多人同时提交迁移时的命名冲突 —— 这些不会报语法错误,但会让 phinx status 显示混乱,甚至导致部分迁移被跳过。上线前务必在预发环境用真实数据集完整走一遍 up/down 循环。



















