phpenv仅管理PHP版本,不安装PostgreSQL;需系统级安装PostgreSQL、编译PHP时指定--with-pdo-pgsql参数、启用pdo_pgsql扩展三步缺一不可。

phpenv 不支持安装 PostgreSQL,它只管理 PHP 版本,不碰数据库。 它和 pgenv、postgres 或 php-pgsql 扩展完全无关。
phpenv 本身不提供任何数据库安装能力
phpenv 是一个纯 PHP 版本切换工具(类似 pyenv),核心职责只有两件事:下载编译指定版本的 PHP、在 shell 中切换 php 命令指向的二进制。它不会:
- 安装或启动
postgresql服务进程 - 下载或配置
pg_config、libpq等 PostgreSQL 构建依赖 - 自动启用或编译
pdo_pgsql扩展(哪怕你装了 PostgreSQL)
想让 phpenv 管理的 PHP 连上 PostgreSQL,得手动配三块
缺一不可,顺序不能错:
- 先在系统级装好 PostgreSQL(比如 Ubuntu 上
sudo apt-get install postgresql),确保pg_config在$PATH里(运行which pg_config能看到路径) - 用 phpenv 安装 PHP 时显式带上
--with-pdo-pgsql参数:CONFIGURE_OPTS="--with-pdo-pgsql" phpenv install 8.2.12;否则默认不编译该扩展 - 确认生成的
php.ini里有extension=pdo_pgsql(Linux/macOS 是.so,Windows 是.dll),且没被注释掉
常见错误:扩展加载了但连不上,八成是 DSN 或权限问题
即使 php -m | grep pgsql 显示 pdo_pgsql,连接仍可能失败。典型表现:
立即学习“PHP免费学习笔记(深入)”;
-
PDOException: SQLSTATE[08006] [7] FATAL: database "my-db" does not exist—— 数据库名含短横线,PostgreSQL 要求双引号,但 DSN 里不能写引号,得改库名为my_db -
PDOException: SQLSTATE[08006] [7] FATAL: password authentication failed for user "xxx"—— PostgreSQL 默认用peer认证,本地连接需改pg_hba.conf为md5或trust - 连接超时卡住 —— PostgreSQL 默认无 statement timeout,DSN 后加
;options='--statement_timeout=5s'防死锁
真正容易被忽略的是:phpenv 编译 PHP 时若没提前装好 libpq-dev(Ubuntu/Debian)或 postgresql-devel(CentOS/RHEL),--with-pdo-pgsql 会静默失效,最终编译出的 PHP 根本不带该扩展——连 php -m 都看不到,更别说报错提示了。



















