macOS Sonoma 升级后 PHP-FPM 中 pg_connect() 失灵的解决方法
2024-03-01 08:33:34
修复 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 应用程序再次正常运行。
常见问题解答
- 为什么 macOS Sonoma 更新会影响 pg_connect() 函数?
macOS Sonoma 更新中更改了 PostgreSQL 连接处理方式,导致直接连接到主机名或 IP 地址不再有效。
- Unix 套接字文件是什么?
Unix 套接字文件是特殊文件,允许进程在同一计算机上的不同应用程序之间进行通信。
- 如果我仍遇到问题,该怎么办?
请检查 PHP、NGINX 和 PostgreSQL 的日志以查找任何错误消息。您还可以在 Stack Overflow 或其他在线论坛上寻求帮助。
- 我可以使用其他方法解决此问题吗?
可以,您可以使用 libpq_connect() 函数来建立到 PostgreSQL 的连接,它允许更灵活地控制连接参数。
- 此解决方案是否适用于其他 macOS 版本?
此解决方案专门针对 macOS Sonoma 14.1 及更高版本。对于其他 macOS 版本,可能需要不同的解决方案。