ThinkPHP 数据库配置文件 pgsql / oracle 写法【扩展】
作者:暮色微凉
时间:2026-07-10
浏览:0
连接ThinkPHP的PostgreSQL需启用pdo_pgsql和pgsql扩展,修改pg_hba.conf放行127.0.0.1的md5认证,hostname必须设为127.0.0.1。Oracle推荐oci8扩展,DB_NAME为完整连接描述符并设置persist=true。多数据库共存时,每个连接键名必须唯一且需声明。
ThinkPHP 要连上 PostgreSQL 可不是改个 type 就能通的,必须同时搞定三件事:PHP 把那两个扩展装上、pg_hba.conf 里放行 127.0.0.1/32 的 md5 认证,以及配置里的 hostname 老老实实写 127.0.0.1,别碰 localhost。下面把细节掰开揉碎讲清楚,顺便把 Oracle 的坑也一并填了。
PostgreSQL 配置要点
连接 PostgreSQL,三个条件缺一不可:
- PHP 扩展:
php_pdo_pgsql和php_pgsql必须同时启用。少一个都会报Fatal error: Call to undefined function pg_connect()或Driver not found,排查第一步先检查这个。 - pg_hba.conf 认证:PostgreSQL 默认只走 Unix socket,想用 TCP 连就得显式加一条规则——
127.0.0.1/32允许md5认证。不加的话,日志里会看到FATAL: no pg_hba.conf entry for host。 - hostname 写法:ThinkPHP 配置里的
hostname必须写成127.0.0.1,绝对不能写localhost。因为localhost会让 PDO 尝试走 socket,而多数 PG 安装要么没监听 socket,要么路径不对,直接连不上。
TP6/TP7 的 config/database.php 示例:
'pgsql' => [ 'type' => 'pgsql', 'hostname' => '127.0.0.1', 'hostport' => '5432', 'database' => 'your_db', 'username' => 'your_user', 'password' => 'your_pass', 'charset' => 'utf8', // 实际无效,PG 字符集由服务端控制,可删 'prefix' => '',],
Oracle 配置要点
ThinkPHP 连 Oracle 推荐用原生 oci8 扩展(不是 PDO),配置比 PG 更敏感,几个关键点得拎清楚:
DB_TYPE设为 oracle(小写最稳,TP3.2 虽然支持大写Oracle,但统一小写能少踩些坑)。DB_NAME不是库名,而是完整的连接描述符,格式和tnsnames.ora一样。比如:(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521))(CONNECT_DATA=(SID=ORCL)))。DB_PARAMS里必须带上'persist' => true,否则连接可能不稳定甚至报错。DB_PORT可填可不填,但显式写上更清晰(默认 1521 或自定义 1029)。
TP3.2 典型配置(全局数组方式):
'DB_TYPE' => 'oracle','DB_HOST' => '192.168.1.100','DB_NAME' => '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521))(CONNECT_DATA=(SID=ORCL)))','DB_USER' => 'scott','DB_PWD' => 'tiger','DB_PORT' => 1521,'DB_CHARSET'=> 'AL32UTF8', // Oracle 推荐用 AL32UTF8 而非 utf8'DB_PARAMS' => ['persist' => true],
多库共存与切换
项目里同时用 PostgreSQL 和 Oracle?那得在配置文件中定义多个独立的连接键名。注意三点:
- 每个键名必须唯一、合法——只允许小写字母、数字和下划线,不能用点号或大写。
- 每个连接都要显式声明
'type'(比如'pgsql'或'oracle'),漏了框架会默认用驱动,后果你懂的。 - 运行时切换用
Db::connect('pgsql_log')或Db::connect('oracle_report'),这里传的是配置键名,不是库名或模型名。 - 模型绑定连接用
protected $connection = 'oracle_report';,注意这个值只在初始化时读一次,运行中动态变更是不生效的。
常见报错与速查
连不上数据库?按顺序排查这四个方向,十有八九能搞定:
- PHP 扩展缺失:Linux 上跑
php -m | grep pgsql或php -m | grep oci8;Windows 直接去 php.ini 里看对应 dll 有没有被注释掉。 - PG 权限拒绝:翻 PostgreSQL 日志,如果看到
FATAL: no pg_hba.conf entry for host,那就是pg_hba.conf里没配对应规则,加上即可。 - Oracle 连接超时:检查
DB_NAME里的 HOST 和 PORT 是否跟监听器一致,别忘了还有防火墙。 - 字符集报错:PostgreSQL 的
charset参数是摆设,直接删掉;Oracle 建议用AL32UTF8,别用utf8给自己找麻烦。
作者最新文章
Photoshop文字外框怎么设置?给文字加边框的实用方法
2026-09-22 16:12
白描 PDF
2026-09-16 17:44
密码键盘
2026-09-16 17:43
3dmax快捷键失效了怎么办
2026-09-16 13:53
Xiaomi 18 Fold首销数据解读:较上代大折叠增长310%的原因与配置分析
2026-09-08 16:55
上一篇:
Java 类加载器与垃圾回收的关系分析
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多


































