已安装 mongodb 扩展而非废弃的 mongo 扩展;连接需用 MongoDB\Driver\Manager 或 MongoDB\Client(依赖 mongodb/mongodb 包);操作必须显式指定数据库和集合;写入需配置 writeConcern 保障可靠性。

确认已安装 mongodb 扩展而非 mongo
PHP 7.0+ 官方只维护 mongodb 扩展(由 mongodb/mongo-php-driver 提供),旧的 mongo 扩展早已废弃且不兼容。如果看到 Class 'MongoClient' not found 或 Extension 'mongo' is not loaded,基本就是装错了扩展。
- 用
php -m | grep mongo检查是否加载了mongodb - Ubuntu/Debian 上装:先
sudo apt install php-mongodb,再确认extension=mongodb.so在php.ini中已启用 - macOS 用 Homebrew:装完后检查
ext-mongodb是否出现在php --ini显示的配置路径里 - Windows 用户需手动下载对应 PHP 版本和线程安全标识的
php_mongodb.dll,放进ext/并在php.ini加extension=php_mongodb.dll
MongoDB\Driver\Manager 是连接入口,不是 MongoDB\Client
官方推荐的现代写法是用 mongodb 扩展 + mongofill 或更常见的——搭配官方高阶库 mongodb/mongodb(通过 Composer)。但底层连接始终由 MongoDB\Driver\Manager 管理。直接 new MongoDB\Client 看似方便,其实它内部仍会创建 Manager 实例;而跳过 Client、直接用 Driver 层,适合需要精细控制连接池或调试连接行为的场景。
- 最简连接:
$manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1:27017'); - 带选项的连接:
new MongoDB\Driver\Manager('mongodb://localhost', ['connectTimeoutMS' => 500]) - 如果用
MongoDB\Client,它要求已安装mongodb/mongodb包:composer require mongodb/mongodb - 注意:Client 不是线程安全的,长生命周期脚本(如 Swoole)中应复用实例,不要每次请求都 new
执行查询前必须先选数据库和集合,没有“默认库”概念
PHP 的 mongodb 扩展不维护当前数据库上下文,所有操作都得显式指定库名和集合名。不像 shell 里 use mydb 后可以直接 db.users.find(),PHP 里漏写数据库名会直接报 Uncaught MongoDB\Driver\Exception\InvalidArgumentException。
- 正确写法:
$collection = $client->selectDatabase('myapp')->selectCollection('users'); - 或者用 Manager + Command 手动发命令:
$cmd = new MongoDB\Driver\Command(['find' => 'users', 'database' => 'myapp', ...]); - 集合名不能含空格、点号或美元符;数据库名也不能以
system.开头(保留前缀) - 如果连接串里写了
/?authSource=admin,不代表操作就在 admin 库,selectDatabase仍要明确传目标库名
写入时默认不抛异常,writeConcern 决定可靠性
调用 $collection->insertOne() 成功返回结果对象,但即使 MongoDB 服务宕机、网络中断,只要 PHP 没收到响应,它也可能静默失败——因为默认 writeConcern 是 {w: 1}(只写主节点,不等确认)。线上业务务必显式设置更强保障。
立即学习“PHP免费学习笔记(深入)”;
- 安全写入:
$collection->insertOne($doc, ['writeConcern' => new MongoDB\Driver\WriteConcern(1, 1000)])(等待主节点确认,超时 1s) - 强一致性场景用
new MongoDB\Driver\WriteConcern('majority'),但会拖慢写入速度 - 批量插入用
insertMany(),同样需传writeConcern参数;不传则沿用默认值 - 注意:
writeConcern对读操作无效,读隔离靠readPreference和事务控制
mongodb://user:pass@host/db?authSource=admin 中的 authSource 必须是用户凭证所在的库(通常是 admin),而不是你要操作的业务库。填错就卡在认证环节,错误信息却只显示 Failed to authenticate,没提具体哪个库。











