连接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,三个条件缺一不可:
长期稳定更新的攒劲资源: >>>点此立即查看<<<
php_pdo_pgsql 和 php_pgsql 必须同时启用。少一个都会报 Fatal error: Call to undefined function pg_connect() 或 Driver not found,排查第一步先检查这个。127.0.0.1/32 允许 md5 认证。不加的话,日志里会看到 FATAL: no pg_hba.conf entry for host。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' => '',],
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 -m | grep pgsql 或 php -m | grep oci8;Windows 直接去 php.ini 里看对应 dll 有没有被注释掉。FATAL: no pg_hba.conf entry for host,那就是 pg_hba.conf 里没配对应规则,加上即可。DB_NAME 里的 HOST 和 PORT 是否跟监听器一致,别忘了还有防火墙。charset 参数是摆设,直接删掉;Oracle 建议用 AL32UTF8,别用 utf8 给自己找麻烦。侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述