Docker部署PHP项目pg_connect连接PostgreSQL出现主机名带"报错
问题根因
- 报错信息中的
"是HTML转义后的双引号实体,说明数据库连接配置在传入pg_connect函数前被意外做了HTML实体编码,导致PHP实际尝试连接的主机名是带双引号的"databaseHost",而非预期的databaseHost,因此无法完成域名解析。 - 同时需要确认Docker Compose内的服务名配置是否符合要求,Docker容器之间使用服务名通信的前提是两个服务归属同一个Docker网络,且PostgreSQL的服务名与连接代码中填写的主机名完全一致。
解决方案
1. 修复配置被HTML转义的问题
- 排查数据库连接配置的读取逻辑:如果配置是从环境变量、配置文件或者框架配置项加载的,检查读取环节是否调用了
htmlspecialchars()、htmlentities()这类转义函数,导致配置值内的双引号被转成了"。 - 可以在
pg_connect执行前增加一行调试代码,验证实际传入的连接字符串是否正确:
var_dump("host=databaseHost port=5432 dbname=dbname user=xxxx password=xxxx"); exit;
如果输出结果里的双引号被替换成了",即可确认是转义逻辑异常,直接移除配置读取环节的多余转义操作即可。
2. 确认Docker Compose服务配置正确
- 检查
docker-compose.yml中PostgreSQL服务的名称是否为databaseHost,正确配置参考示例:
version: '3' services: # 该服务名就是PHP容器内可解析的主机名 databaseHost: image: postgres:14-alpine environment: POSTGRES_DB: dbname POSTGRES_USER: xxxx POSTGRES_PASSWORD: xxxx restart: always php-web: build: . ports: - "80:80" depends_on: - databaseHost restart: always
- 如果PostgreSQL的服务名不是
databaseHost,要么将连接代码里的host值修改为实际的服务名,要么将PostgreSQL服务的名称调整为databaseHost。
3. 额外验证步骤
- 进入PHP容器内部执行
ping databaseHost,确认可以正常解析到PostgreSQL容器的IP,如果ping不通,检查两个服务是否归属同一个Compose项目的默认网络,未手动指定其他不互通的网络。 - 确认PostgreSQL容器正常启动,无端口配置错误或启动失败的问题。
内容的提问来源于stack exchange,提问作者Yogendra
相关产品推荐
相关产品推荐

