必须编写自定义connector类(如daruma)继承think\db\connector\connector,重写connect()方法建立达梦等非标数据库连接并返回兼容mysql connection实例,再在database.php中注册驱动配置,才能在不破坏查询构建器与事务机制前提下实现原生支持。

要在 ThinkPHP 5.1 中实现对非标准数据库(如达梦、人大金仓、或自定义协议的嵌入式存储)的原生支持,必须绕过内置的 PDO/MySQLi 封装层,从底层编写自定义 Connector——它负责建立连接、传递配置、返回符合 Db 类契约的 Connection 实例,且不能破坏框架的查询构建器与事务管理机制。
理解 Connector 的职责边界
ThinkPHP 5.1 的 Db 类通过 【Driver → Connector → Connection】 三级结构解耦数据库操作:Driver 定义 SQL 语法和方言,Connector 负责连接初始化,Connection 承载执行逻辑。自定义 Connector 不处理 SQL 编译、不实现 query() 方法,只做一件事:根据传入的配置数组,返回一个已连接、可被 Db::connect() 接收的 Connection 对象实例。
若跳过 Connector 直接 new Connection,会导致事务无法挂载到 Db 类的全局连接池,后续调用 startTrans() 会失效。
创建 Connector 类文件
在 application/common/connector/ 目录下新建 Daruma.php(以国产达梦数据库为例):
这一步操作起来很简单,直接把文件拖进去就行。
文件路径必须是 application/common/connector/Daruma.php,类名必须为 Daruma,且需继承 think\db\connector\Connector —— 框架通过反射自动加载时,会按类名匹配驱动配置中的 type 值。
重写 connect 方法
在 Daruma.php 中,覆盖父类的 connect() 方法:
方法一:使用原生达梦 PHP 扩展 dm8
第一步:检查扩展是否加载 → 若 extension_loaded('dm8') 返回 false,则抛出异常;否则继续。
第二步:用 dm_connect() 建立连接 → 传入 $config['hostname']、$config['database']、$config['username']、$config['password']、$config['hostport'](注意达梦默认端口是 5236,不是 3306)。
第三步:设置字符集 → 必须执行 dm_query($link, "SET NAMES {$config['charset']}"),否则中文入库乱码;【若未执行此步,后续所有 INSERT 都将写入乱码,且不可逆】。
第四步:返回 think\db\connection\Mysql 实例 → 这里是关键 trick:达梦 SQL 语法与 MySQL 高度兼容,复用 Mysql Connection 类可直接支持 query()、execute()、事务 begin/commit/rollback,无需重写 Connection。
方法二:使用 PDO_DM(需提前编译安装 pdo_dm 扩展)
构造 DSN 字符串为 'dm:server={$config["hostname"]};port={$config["hostport"]};dbname={$config["database"]}' → 注意不能漏掉 port 参数,达梦 PDO 驱动不接受默认端口推断。
注册并配置驱动
在 database.php 配置文件中添加:
'daruma' => [
'type' => 'daruma',
'hostname' => '127.0.0.1',
'database' => 'MYDB',
'username' => 'SYSDBA',
'password' => 'SYSDBA',
'hostport' => 5236,
'charset' => 'UTF-8',
],
然后在数据库配置顶部加入 'default' => 'daruma',或显式调用 Db::connect('daruma')。
这一步做完后,Db::table('user')->select() 就会走你写的 Daruma Connector,完成连接建立并返回复用 Mysql Connection 的实例。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











