thinkphp 连接 postgresql 需同时满足三条件:启用 php_pdo_pgsql 和 php_pgsql 扩展、pg_hba.conf 显式允许 127.0.0.1/32 md5 访问、thinkphp 配置 hostname 必须为 127.0.0.1(非 localhost)并显式指定 hostport=5432。

ThinkPHP 连接 PostgreSQL 不是改个 type 就能通的,至少有三处不填对就直接报错:PHP 扩展没启、pg_hba.conf 拒绝连接、配置里写 localhost 却走 Unix socket。
PHP 必须启用 php_pdo_pgsql 和 php_pgsql 扩展
缺任一扩展都会报 Fatal error: Call to undefined function pg_connect() 或 Driver not found。Windows 下检查 php.ini 是否有这两行且未被注释:
extension=php_pgsql.dll extension=php_pdo_pgsql.dll
Linux/macOS 用 apt install php-pgsql 或 brew install php@8.2-pgsql(版本需匹配)。Apache 用户额外注意:libpq.dll(Windows)或 libpq.so(Linux)必须能被 PHP 动态加载,否则日志里会显示 Unable to load dynamic library。
pg_hba.conf 配置错误导致 FATAL: no pg_hba.conf entry for host
PostgreSQL 默认只允许本地 Unix socket 连接,127.0.0.1 也得显式放行。编辑 PostgreSQL 的 data/pg_hba.conf,在 # IPv4 local connections: 下加一行:
host all all 127.0.0.1/32 md5
别手抖删空格——该文件靠缩进识别字段分隔。如果用 Docker 或远程连接,把 127.0.0.1/32 换成对应 IP 段;测试阶段可临时写 trust,但上线前务必改回 md5。
ThinkPHP 配置里 hostname 别写 localhost
写 localhost 会让 PDO 尝试走 Unix socket,而多数 PostgreSQL 安装默认不监听 socket(或路径不对),结果连不上还报错模糊。必须写 127.0.0.1 强制走 TCP:
-
type固定为pgsql(TP6/TP7 小写,TP3.2 可大写Pgsql) -
hostname填127.0.0.1,不是localhost -
charset参数无效——PostgreSQL 字符集由服务端控制,设了也不生效,删掉省心 -
hostport显式写5432,别依赖默认值(某些环境会 fallback 到 0)
TP6/TP7 的 config/database.php 示例片段:
'connections' => [
'pgsql' => [
'type' => 'pgsql',
'hostname' => '127.0.0.1',
'database' => 'myapp',
'username' => 'postgres',
'password' => 'xxx',
'hostport' => '5432',
// 'charset' => 'utf8' ← 删除这一行
]
]
表名含关键字(如 user)时必须双引号转义
PostgreSQL 把 user、order、group 当保留字,直接写 Db::name('user') 会报语法错误。模型里要这么写:
class User extends Model
{
protected $table = '"user"'; // 注意双引号在字符串内
}
或者查询时手动转义:
$users = Db::name('"user"')->select();
这个坑不会在连接阶段暴露,而是第一次查表时才崩,容易误判为配置问题。
真正卡住人的往往不是“怎么配”,而是 pg_hba.conf 改了没 reload、扩展启了但 Apache 没重启、localhost 和 127.0.0.1 的行为差异被忽略——这些地方一动不动,其他全对也没用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











