You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

测试环境无法连接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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:24:16