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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:54:01