返回

macOS Sonoma 升级后 PHP-FPM 中 pg_connect() 失灵的解决方法

php

修复 macOS Sonoma 升级后 PHP-FPM 中 pg_connect() 失灵问题

前言

对于 PHP 开发者来说,pg_connect() 函数的突然失灵可能会让人感到沮丧。特别是当它发生在 macOS Sonoma 升级之后。但不要担心,这个问题有明确的解决方案。

问题

升级 macOS 到 Sonoma 14.1 后,通过 PHP-FPM 调用 pg_connect() 不再返回。该函数在 NGINX 请求中挂起,导致“Bad Gateway”错误。

解决方案

解决此问题的关键在于修改 pg_connect() 连接字符串中的“host”参数。具体来说,需要将“host=xxx”更改为“host=/var/run/postgresql”。

修改后的连接字符串

$db = pg_connect("host=/var/run/postgresql port=5432 dbname=appdb user=appuser");

为什么有效?

在 Sonoma 更新中,macOS 对 PostgreSQL 连接处理方式进行了更改。以前,“host=xxx”参数直接连接到主机名或 IP 地址。但现在,它尝试通过 Unix 套接字连接。

“/var/run/postgresql”是 Unix 套接字文件,它充当 PostgreSQL 服务的端点。通过将连接字符串中的“host”参数更改为该套接字文件,它将绕过 macOS 的新连接处理方式。

其他注意事项

  • 确保 PostgreSQL 服务正在运行,并且可以通过 Unix 套接字访问。
  • 如果您使用的是 PostgreSQL 16,请确保已安装 libpq 16+。
  • 如果您仍遇到问题,请检查 PHP、NGINX 和 PostgreSQL 的日志以查找任何错误消息。

结论

通过将 pg_connect() 连接字符串中的“host”参数更改为“host=/var/run/postgresql”,您可以解决 macOS Sonoma 升级后 PHP-FPM 中 pg_connect() 无法返回的问题。这将重新建立与 PostgreSQL 服务的连接,让您的 PHP/PostgreSQL/NGINX 应用程序再次正常运行。

常见问题解答

  1. 为什么 macOS Sonoma 更新会影响 pg_connect() 函数?

macOS Sonoma 更新中更改了 PostgreSQL 连接处理方式,导致直接连接到主机名或 IP 地址不再有效。

  1. Unix 套接字文件是什么?

Unix 套接字文件是特殊文件,允许进程在同一计算机上的不同应用程序之间进行通信。

  1. 如果我仍遇到问题,该怎么办?

请检查 PHP、NGINX 和 PostgreSQL 的日志以查找任何错误消息。您还可以在 Stack Overflow 或其他在线论坛上寻求帮助。

  1. 我可以使用其他方法解决此问题吗?

可以,您可以使用 libpq_connect() 函数来建立到 PostgreSQL 的连接,它允许更灵活地控制连接参数。

  1. 此解决方案是否适用于其他 macOS 版本?

此解决方案专门针对 macOS Sonoma 14.1 及更高版本。对于其他 macOS 版本,可能需要不同的解决方案。