php连接postgresql提示认证失败_php连pg认证问题解决【方案】

pg_connect()报authentication failed的主因是pg_hba.conf中host规则未匹配PHP连接的IP+用户+数据库组合、localhost被解析为::1而配置仅含127.0.0.1/32、密码错误或用户无LOGIN权限、服务未重载配置、PHP连接串触发peer而非md5认证、scram-sha-256密码加密与旧版PHP不兼容。

php连接postgresql提示认证失败_php连pg认证问题解决【方案】

pg_connect() 报错 authentication failed 的常见原因

不是密码错了就是认证方式不匹配。PostgreSQL 默认启用 peermd5 认证,而 PHP 用 pg_connect() 连接时默认走 TCP(localhost 解析为 127.0.0.1),这时 pg 实际查的是 host 行的规则,而非 local 行 —— 很多人改了 local 却没动 host,导致白忙活。

  • pg_hba.confhost 规则未覆盖 PHP 所用的 IP+用户+数据库组合
  • PHP 连接串用了 localhost,但 PostgreSQL 把它解析成 IPv6 的 ::1,而 pg_hba.conf 只写了 127.0.0.1/32
  • 用户密码确实不对,或该用户没被赋予登录权限(ALTER USER xxx WITH LOGIN;
  • PostgreSQL 服务没重载配置:sudo systemctl reload postgresqlpg_ctl reload

连接串写法直接影响认证路径

PHP 的 pg_connect() 参数顺序和关键字很关键。用 host=localhosthost=127.0.0.1 在 pg 看来是两条不同规则;前者可能触发 peer(仅限 Unix socket),后者强制走 TCP + md5

  • 要确保走 TCP 并用密码:显式写 host=127.0.0.1 port=5432 user=xxx password=yyy dbname=zzz
  • 避免只写 host=localhost,除非你确认 pg_hba.conf 有对应 host ... localhost 规则
  • 测试连通性优先用命令行:psql -h 127.0.0.1 -U your_user -d your_db,成功了再调 PHP

pg_hba.conf 必须匹配的三要素

每一行规则必须同时满足「连接方式 + 客户端地址 + 数据库 + 用户」才生效。漏掉任意一个,就 fallback 到下一行,最终可能落到 reject

  • 加一行明确的 host 规则,例如:host all all 127.0.0.1/32 md5开发环境够用)
  • 如果 PHP 和 PostgreSQL 不在同一机器,把 127.0.0.1/32 换成实际来源 IP 或网段,如 192.168.1.0/24
  • 修改后必须重载,SELECT pg_reload_conf(); 也行,但要注意权限
  • 检查当前生效规则:sudo -u postgres psql -c "SELECT * FROM pg_hba_file_rules();"

密码加密方式不兼容也会失败

PostgreSQL 10+ 默认用 scram-sha-256 加密存储密码,但老版本 PHP 的 pgsql 扩展(尤其 php7.4 及更早)不支持该机制,会静默降级失败。

Etna

Etna

Etna:用文字做AI世界的造物主

下载

立即学习PHP免费学习笔记(深入)”;

  • 临时方案:在 postgresql.conf 中设 password_encryption = md5,然后 ALTER USER xxx WITH PASSWORD 'yyy';
  • 长期方案:升级 PHP 到 8.0+,并确认 pgsql 扩展编译时链接了足够新版本的 libpq
  • 验证密码加密方式:SELECT rolname, rolpassword FROM pg_authid WHERE rolname = 'your_user';,若含 SCRAM-SHA-256 字样即为新格式

实际调试时,最省时间的做法是先关掉所有干扰:临时把 pg_hba.conf 最上面加一行 host all all 127.0.0.1/32 trust,确认 PHP 能连上,再逐步收紧规则。很多人卡在以为问题出在代码,其实只是配置没对齐。

https://www.php.cn/faq/2035265.html

发表回复

Your email address will not be published. Required fields are marked *