gaussdb(for mongo)需用thinkphp 6的topthink/think-mongo≥2.0.0扩展,配置type为'mongo'、hostname去前缀、hostport为8635、authmechanism=scram-sha-256且ssl=true(布尔值),并显式调用name()指定集合。

mysql 或 mongo 驱动连接**——它需要显式启用 MongoDB 兼容模式,并且必须使用支持 SASL 认证、TLS 加密和 SRV 解析的客户端配置。很多项目卡在“连接超时”或“auth failed”,根本原因不是密码错,而是驱动不匹配或认证机制没对齐。
ThinkPHP 6 必须用 topthink/think-mongo 扩展,且版本要 ≥ 2.0.0
ThinkPHP 官方 think-mongo 1.x(如 1.*)只支持 MongoDB 3.x/4.x 原生协议,**不支持 GaussDB(for Mongo) 要求的 SCRAM-SHA-256 + TLSv1.2+ 认证流程**。强行使用会报 Authentication failed 或 Failed to parse URI。
正确做法是:
- 卸载旧版:
composer remove topthink/think-mongo - 安装新版:
composer require topthink/think-mongo:^2.0.0(该版本底层基于mongodb/mongodb1.15+,支持authMechanism=SCRAM-SHA-256) - 确认 PHP 已启用
mongodb扩展(非mongo,后者已废弃),运行php -m | grep mongodb应有输出
database.php 中 GaussDB(for Mongo) 的关键配置项
GaussDB(for Mongo) 控制台生成的连接串形如:mongodb+srv://user:pass@cluster-xxx.gaussdb.com:8635/?ssl=true&authSource=$external&authMechanism=SCRAM-SHA-256。但 ThinkPHP 不接受完整 DSN,必须拆解为数组字段:
-
'type'必须设为'mongo'(注意不是'mongodb'或'gaussdb') -
'hostname'填集群地址(如'cluster-xxx.gaussdb.com'),**不能带mongodb+srv://前缀** -
'hostport'固定填'8635'(GaussDB(for Mongo) 默认端口,非 27017) -
'database'填你要操作的逻辑库名(不是$external) -
'username'和'password'用控制台分配的账号密码(区分大小写,含特殊字符需urlencode()) -
'params'数组中必须显式声明:'ssl' => true、'authSource' => '$external'、'authMechanism' => 'SCRAM-SHA-256'
示例片段:
'gaussdb_mongo' => [
'type' => 'mongo',
'hostname' => 'cluster-abc123.gaussdb.com',
'hostport' => '8635',
'database' => 'myapp',
'username' => 'gauss_user',
'password' => 'P%40ssw0rd%21', // 已 urlencode()
'params' => [
'ssl' => true,
'authSource' => '$external',
'authMechanism' => 'SCRAM-SHA-256',
'connectTimeoutMS' => 10000,
'socketTimeoutMS' => 30000,
],
],
连接测试失败时优先检查这三处
本地连不通?别急着改代码,先验证基础链路:
- 用
mongosh命令行直连:mongosh "mongodb+srv://gauss_user:P%40ssw0rd%21@cluster-abc123.gaussdb.com:8635/myapp?ssl=true&authSource=%24external&authMechanism=SCRAM-SHA-256"—— 若此处失败,说明网络或白名单未开,跟 ThinkPHP 无关 - 确认华为云安全组和 VPC 流量策略放行了出方向
8635端口(不是 27017) - 检查 PHP 的
openssl扩展是否启用(php -m | grep openssl),GaussDB(for Mongo) 强制 TLS,缺它必报SSL handshake failed
用 Db::connect('gaussdb_mongo') 时别漏掉 name() 显式指定集合
GaussDB(for Mongo) 不支持默认集合自动推导。即使你配置了 'database' => 'myapp',调用 Db::connect('gaussdb_mongo')->select() 会直接报错 Collection name is required。
所有操作必须显式绑定集合名:
$db = Db::connect('gaussdb_mongo');
$data = $db->name('users')->where(['status' => 1])->select(); // ✅ 正确
$data = $db->where(['status' => 1])->select(); // ❌ 报错:Collection name is required
另外,GaussDB(for Mongo) 对 $regex、$text 等高级查询支持有限,复杂聚合建议先在控制台用 mongosh 验证语法是否被识别。
ssl 参数在 params 里必须是布尔值 true,不能写成字符串 'true' 或数字 1——否则底层驱动会静默忽略 TLS,导致认证被拒绝。这个细节在华为云文档里藏得很深,但却是高频踩坑点。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











