phpenv 不能一键安装 postgresql,它仅内置 mysql、mariadb 和 sqlite;使用 postgresql 需手动安装服务端并启用 php 的 pgsql 扩展,否则调用 pg_connect() 或 pdo 连接会报“function not found”或“could not find driver”错误。

phpEnv 本身不内置 PostgreSQL,也不能直接安装或管理 PostgreSQL 实例。它只负责 PHP、Apache/Nginx、MySQL 的集成与切换。想在 phpEnv 环境中使用 PostgreSQL,必须手动安装 PostgreSQL 并配置 PHP 的 pgsql 扩展——否则 pg_connect() 会报“function not found”或“undefined function”错误。
phpEnv 能否一键装 PostgreSQL?
不能。phpEnv 的官方安装包(截至 2026 年 4 月)仅包含 MySQL(5.7/8.0)、MariaDB 和 SQLite 支持,不含 PostgreSQL 二进制文件、服务管理脚本或初始化工具。试图在 phpEnv 控制面板里找“PostgreSQL 安装按钮”会落空。
常见误操作包括:
- 在 phpEnv 设置里勾选“启用 PostgreSQL”——该选项实际不存在,是用户凭经验脑补的
- 把 PostgreSQL 的
bin目录加进系统 PATH 后,以为 phpEnv 自动识别——但 phpEnv 不读取外部 PostgreSQL,只管自己 bundled 的 MySQL - 用 phpEnv 启动 Apache 后,直接在 PHP 脚本里调用
pg_connect()——必然失败,因pgsql扩展未启用
手动装 PostgreSQL + 配 PHP 的 pgsql 扩展
Windows 下推荐用 EnterpriseDB 官方安装包(如 PostgreSQL 14.12 或 15.7),安装时勾选 “Add to PATH” 和 “Initialize database cluster”。装完后验证:
psql --version
若输出版本号,说明服务端就绪。接着配 PHP:
- 找到 phpEnv 当前激活的 PHP 版本目录,例如
C:\phpenv\versions\8.3.13\ - 编辑
php.ini,取消注释这一行:extension=pgsql(不是php_pdo_pgsql.dll,那是旧写法) - 确认
extension_dir指向正确的ext目录,例如extension_dir = "C:\phpenv\versions\8.3.13\ext" - 重启 phpEnv 的 Apache 服务(或整个控制面板),再运行
php -m | findstr pgsql,应看到pgsql和pdo_pgsql
漏掉任意一步,new PDO('pgsql:host=127.0.0.1;dbname=test', $u, $p) 都会抛出 PDOException: could not find driver。
ThinkPHP/Laravel 中配置多类型数据库(MySQL + PostgreSQL)
框架层面可以共存,但需严格区分连接名和驱动。以 ThinkPHP 6 为例:
在 .env 中定义两个独立区块:
[DATABASE] TYPE=mysql HOSTNAME=127.0.0.1 DATABASE=shop_db USERNAME=root PASSWORD=123456 [DATABASE_PG] TYPE=pgsql HOSTNAME=127.0.0.1 DATABASE=log_db USERNAME=postgres PASSWORD=123456 HOSTPORT=5432
然后在 config/database.php 中显式声明连接:
'connections' => [
'mysql' => [
'type' => env('DATABASE_TYPE', 'mysql'),
'hostname' => env('DATABASE_HOSTNAME', '127.0.0.1'),
// ... 其他 MySQL 参数
],
'pgsql' => [
'type' => env('DATABASE_PG_TYPE', 'pgsql'),
'hostname' => env('DATABASE_PG_HOSTNAME', '127.0.0.1'),
'hostport' => env('DATABASE_PG_HOSTPORT', '5432'),
// ... 其他 PostgreSQL 参数
],
]
关键点:
- 不同数据库必须用不同连接名(如
mysql和pgsql),不能都叫default - ThinkPHP 不自动加载
DATABASE_PG_*前缀变量,必须在 config 里显式调用env()读取 - 执行前务必清空缓存:
php think clear:config,否则改了.env也无效
最易被忽略的是:PostgreSQL 的 pg_hba.conf 默认拒绝所有远程连接,即使本地 PHP 脚本用 127.0.0.1 连,也可能被拦在门外。检查该文件末尾是否含这行:host all all 127.0.0.1/32 scram-sha-256。没有就加,加完要重启 PostgreSQL 服务。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











