首页 > 编程语言 >ThinkPHP数据库配置文件pgsql/oracle写法【扩展】

ThinkPHP数据库配置文件pgsql/oracle写法【扩展】

来源:互联网 2026-07-10 08:12:06

连接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 的坑也一并填了。

ThinkPHP数据库配置文件pgsql/oracle写法【扩展】

PostgreSQL 配置要点

连接 PostgreSQL,三个条件缺一不可:

长期稳定更新的攒劲资源: >>>点此立即查看<<<

  • PHP 扩展php_pdo_pgsqlphp_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 pgsqlphp -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 给自己找麻烦。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。