根本原因不是 symfony 版本问题,而是本地 php 环境无法解析 rds 内网域名、docker 网络与 rds 内网段路由冲突,或 ssl 证书验证失败。

根本原因不是 Symfony 版本问题,而是本地 PHP 环境无法解析 RDS 内网域名或路由被 Docker 干扰。
本地 Symfony 应用连不上 RDS 的 host 解析失败
当你在 .env 里写 DATABASE_URL=mysql://root:pwd@rm-xxx.mysql.rds.aliyuncs.com:3306/dbname,Symfony 启动时会尝试解析 rm-xxx.mysql.rds.aliyuncs.com。但这个域名默认只在阿里云内网 DNS 生效——你本地机器没接入阿里云 VPC,DNS 查不到,直接报 php bin/console doctrine:database:create 失败或 getaddrinfo failed。
- 现象:错误里带
Temporary failure in name resolution或php_network_getaddresses: getaddrinfo failed - 验证方式:
nslookup rm-xxx.mysql.rds.aliyuncs.com在本地返回** server can't find ...: NXDOMAIN - 临时解法:把
host换成 RDS 控制台里显示的「内网地址」IP(如172.22.10.5),但仅限你本地能直连该 IP(比如 ECS 和 RDS 同 VPC) - 长期建议:用阿里云提供的公网地址 + 白名单(不推荐生产),或走跳板机 / SSH 隧道
Docker 容器里跑 Symfony 连 RDS 报 Connection refused
宿主机上 telnet 172.22.10.5 3306 成功,但容器里 telnet 不通——大概率是 Docker 自建网络和 RDS 内网段重叠(比如都是 172.22.0.0/16),Linux 路由表优先匹配本地 docker network,包根本发不出去。
- 查冲突:
ip route | grep 172.22和docker network ls对照看 CIDR 是否重复 - 删冲突网:
docker network rm myapp_default(名称按实际改) - 重建避开:
docker network create --subnet=192.168.100.0/24 myapp_net,再docker-compose up --network=myapp_net - 别依赖
bridge默认网:它的子网是动态分配的,下次重启可能又撞上
SSL 连接被拒绝或证书验证失败
RDS 开启 SSL 后,Symfony 默认不校验证书,但若配置了 ?sslmode=require 或应用强制校验,而没提供 CA 文件,就会卡在握手阶段。
- 现象:
SSL connection error: unknown error number或连接超时无日志 - 确认 RDS SSL 状态:控制台「参数设置」里
require_secure_transport是否为ON;「SSL 设置」是否已启用 - 本地调试可临时绕过:
DATABASE_URL="mysql://root:pwd@rm-xxx...?sslmode=disable" - 生产必须用证书:下载 RDS 控制台提供的
aliyun_rds.pem,挂载进容器,加参数?sslca=/path/to/aliyun_rds.pem&sslmode=verify-full
真正卡住人的从来不是 Symfony 版本号,而是 DNS、路由、SSL 这三层“看不见的墙”。尤其 Docker 网络和阿里云内网段撞车这事,查 route -n 之前谁也想不到是它。











