测试环境无法连接api_test数据库,Doctrine命令执行失败
解决测试数据库连接失败的问题
错误原因分析
报错SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known的核心问题是PHP无法解析数据库连接URL中的database主机名。生产环境能正常工作是因为其网络环境支持该主机名解析,但测试环境不具备这个条件。
分步解决方案
1. 验证主机名是否可解析
在执行Doctrine命令的终端中运行:
ping database
如果返回“Name or service not known”,说明当前环境无法识别这个主机名,按以下场景处理:
- Docker环境:
- 确保执行命令的容器和数据库容器处于同一个Docker网络;
- 或者将
DATABASE_TEST_URL中的database替换为localhost(前提是数据库容器已将3306端口映射到宿主机)。
- 本地开发环境:
- 直接把
DATABASE_TEST_URL里的database改成127.0.0.1或localhost。
- 直接把
2. 确保命令加载测试环境配置
执行Doctrine命令时必须指定--env=test,否则when@test段的配置不会生效,导致test连接未被初始化:
php bin/console doctrine:database:drop --env=test --connection=test --force --if-exists
(注:布尔参数--force和--if-exists无需加=1,直接使用即可)
3. 检查测试连接配置是否加载成功
运行以下命令查看测试环境下的Doctrine连接配置:
php bin/console debug:doctrine --env=test
确认输出中存在test连接,且其URL与DATABASE_TEST_URL一致。
4. 直接测试数据库连接(排除Doctrine干扰)
创建一个简单的PHP脚本test-connection.php:
<?php $url = getenv('DATABASE_TEST_URL'); $parts = parse_url($url); $conn = new mysqli($parts['host'], $parts['user'], $parts['pass'], substr($parts['path'], 1), $parts['port']); if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } echo "连接成功";
在测试环境下运行脚本验证底层连接:
APP_ENV=test php test-connection.php
如果连接失败,说明问题出在数据库网络/权限配置,而非Doctrine;如果成功,再排查Doctrine的配置细节。
5. Docker环境额外注意点
如果你的应用和数据库都在Docker容器中,不要在宿主机执行Doctrine命令,因为宿主机无法解析容器名database。正确做法是进入应用容器内部执行:
docker exec -it <你的应用容器名称> php bin/console doctrine:database:drop --env=test --connection=test --force --if-exists
内容的提问来源于stack exchange,提问作者Toma Tomov
相关产品推荐
相关产品推荐

