PHP连不上PostgreSQL,90%因pgsql扩展未加载:pg_connect()会静默失败;须确认PostgreSQL服务运行、编辑MAMP对应php.ini启用pgsql和pdo_pgsql扩展、重启MAMP全局进程,并用phpinfo()和function_exists('pg_connect')验证。

PHP 连不上 PostgreSQL,90% 是因为 pgsql 扩展根本没加载——pg_connect() 会静默失败,不报错、不跳转、不输出,连 echo "after pg_connect" 都不会执行。
确认 PostgreSQL 服务确实在跑,且和 PHP 无关
pgAdmin 能连 ≠ PHP 能连。PostgreSQL 启动是独立进程,PHP 只是客户端。必须单独验证:
- macOS:打开 Activity Monitor,搜
postgres,看有没有主进程(不是postmaster子进程) - 终端执行
pg_ctl status或brew services list | grep postgresql,状态必须是started - Windows:在服务管理器里找
postgresql-x64,状态为“正在运行” - 别依赖 MAMP 界面里的“MySQL Server”绿灯——它对 PostgreSQL 完全无感
找到并编辑 MAMP 真正生效的 php.ini
MAMP 的 php.ini 不是系统路径下的那个。改错文件等于白干:
- 在 PHP 文件里写
<?php phpinfo(); ?>,访问后看页面顶部 “Loaded Configuration File” 的路径 - MAMP Free 版:菜单 → File → Edit Template → PHP → 选中当前版本 →
php.ini - macOS 上该文件通常在
/Applications/MAMP/bin/php/php[version]/conf/php.ini - 改完保存前,用文本编辑器搜索确认里面没有重复的
extension=pgsql行(避免冲突)
启用 pgsql 和 pdo_pgsql 扩展,注意平台差异
仅开 pgsql 不够,PDO 场景下还必须开 pdo_pgsql;扩展名因系统而异:
立即学习“PHP免费学习笔记(深入)”;
- macOS(MAMP):取消注释这两行(删掉开头的
;):extension=pgsqlextension=pdo_pgsql - Windows(MAMP):对应行应为:
extension=php_pgsql.dllextension=php_pdo_pgsql.dll - 若扩展文件缺失(
pgsql.so或php_pgsql.dll找不到),说明 MAMP 没带 PostgreSQL 客户端库——需手动安装 EnterpriseDB 的 PostgreSQL 安装包,并确保其libpq.dll(Win)或libpq.dylib(macOS)在系统 PATH 或 MAMP 的 bin 目录下可被 PHP 加载
重启 MAMP 全局进程,不是点“Restart Servers”
只点界面右下角的 “Restart Servers” 不会重载 php.ini 修改。必须彻底退出再启动:
- macOS:点击 MAMP 窗口左上角红点关闭,再从 Dock 或 Applications 重新打开
- Windows:右键任务栏 MAMP 图标 → Exit,再双击桌面快捷方式启动
- 启动后立刻访问
phpinfo()页面,搜索pgsql,确认 “Registered PHP Streams” 包含pgsql,且 “Additional .ini files parsed” 列出你刚改的php.ini路径 - 测试连接时,别只写
pg_connect("host=localhost port=5432 dbname=test user=postgres")——加个or die(pg_last_error()),否则还是静默失败
最容易被忽略的是:MAMP 启动时若 PostgreSQL 服务未就绪,它不会等,也不会报错;而 PHP 加载扩展失败时,pg_*() 函数直接不可用,连 function_exists('pg_connect') 都会返回 false——这个判断比任何连接字符串都早,也最准。



















