SLIM PHP中使用PHINX无法连接MySQL容器执行迁移求助
解决Phinx连接Docker MySQL容器被拒绝的问题
错误原因分析
你遇到的SQLSTATE[HY000] [2002] Connection refused错误,核心是Phinx的数据库连接配置和Docker环境不匹配,分两种场景:
- 如果你的PHP项目运行在本地(非Docker容器):Phinx默认使用3306端口连接,但你的MySQL容器把内部3306端口映射到了宿主机的3307,导致端口不匹配。
- 如果你的PHP项目运行在Docker容器中:配置里的
127.0.0.1指向容器自身,而非同网络下的MySQL容器,无法跨容器通信。
针对性解决方案
场景1:PHP项目在本地运行
修改phinx.php和Migration基类的配置,指定MySQL容器映射到宿主机的端口3307:
- 修改phinx.php配置
'result' => [ // ...其他配置 'environments' => [ 'default_environment' => 'dev', 'default_database' => 'dev', 'dev' => [ 'adapter' => 'mysql', 'host' => '127.0.0.1', 'port' => 3307, // 新增:指定宿主机映射端口 'name' => 'db_slim', 'user' => 'db_slim', 'pass' => 'root', ] ] ];
- 修改Migration基类的连接配置
$this->capsule->addConnection([ 'driver' => 'mysql', 'host' => '127.0.0.1', 'port' => 3307, // 新增:对应宿主机映射端口 'database' => 'db_slim', 'username' => 'db_slim', 'password' => 'root', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', ]);
场景2:PHP项目在Docker容器中运行
确保PHP容器已加入php-challenge网络(和MySQL容器同网络),然后用Docker内部的服务名/容器名作为Host:
- 修改phinx.php配置
'result' => [ // ...其他配置 'environments' => [ 'default_environment' => 'dev', 'default_database' => 'dev', 'dev' => [ 'adapter' => 'mysql', 'host' => 'mysql_slim', // 使用MySQL容器名或服务名`mysql` 'port' => 3306, // 用容器内部原生端口,无需映射端口 'name' => 'db_slim', 'user' => 'db_slim', 'pass' => 'root', ] ] ];
- 修改Migration基类的连接配置
$this->capsule->addConnection([ 'driver' => 'mysql', 'host' => 'mysql_slim', // 或服务名`mysql` 'port' => 3306, 'database' => 'db_slim', 'username' => 'db_slim', 'password' => 'root', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', ]);
额外检查项
- 用
docker ps确认mysql_slim容器处于运行状态 - 用
docker logs mysql_slim查看容器日志,确认MySQL服务已完全启动(避免容器刚启动还未就绪就执行迁移)
内容的提问来源于stack exchange,提问作者Henrique Albuquerque
相关产品推荐
相关产品推荐

