惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google Online Security Blog
Google Online Security Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Stack Overflow Blog
Stack Overflow Blog
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
I
InfoQ
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
Martin Fowler
Martin Fowler
腾讯CDC
C
CERT Recently Published Vulnerability Notes
博客园 - 聂微东
L
LINUX DO - 热门话题
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Security Blog
Microsoft Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
WordPress大学
WordPress大学
C
Cisco Blogs
A
Arctic Wolf
Latest news
Latest news
Jina AI
Jina AI
P
Proofpoint News Feed
博客园 - 叶小钗
Vercel News
Vercel News
T
Threat Research - Cisco Blogs
博客园 - 三生石上(FineUI控件)
K
Kaspersky official blog
C
Check Point Blog
H
Heimdal Security Blog
博客园 - Franky
小众软件
小众软件
The Register - Security
The Register - Security
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Google DeepMind News
Google DeepMind News
AWS News Blog
AWS News Blog
The Hacker News
The Hacker News
T
The Exploit Database - CXSecurity.com
aimingoo的专栏
aimingoo的专栏
Project Zero
Project Zero
G
GRAHAM CLULEY
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Scott Helme
Scott Helme
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
NISL@THU
NISL@THU

博客园 - pcwanli

Python批量将Word文档(.doc)转换为.docx格式的完整实现步骤 Linux下版本控制器(SVN) -命令行客户端 linux svn 命令 Qwen3-VL视频科技:内容审核系统搭建 svn update 出现Skipped 'feifazuzhi' -- Node remains in conflict处理方法 linux redis.service如何编写 深入php redis pconnect PHP中使用Redis长连接笔记 python happybase 批量读取 如何用phpredis持久化连接pconnect方法提升应用响应速度 python处理常见格式压缩包文件的全指南 Python编程:happybase读写HBase数据库 python redis zset 按分值获取记录 hbase日志如何清理 hbase日志清理 Python的time.strftime()方法 python re.sub第二参数,前值如何引用 【Python】基于python实现Windows Service程序 python解析url参数 提取网页源码头信息的正则表达式 PHP字符串分割:explode()函数详解与应用 python requests get请求禁用自动解压 python importlib动态模块加载遇到is not a package错误,解决方法。 Python正则表达式替换(re.sub)的6种典型应用场景 用Python处理HTML转义字符的5种方式 pymongo批量更新bulk_write PHP 通过 Thrift 操作 Hbase 使用thrift的php版本操作hbase数据库 PHP通过Thrift操作Hbase
php mongodb操作
pcwanli · 2026-03-04 · via 博客园 - pcwanli

来源:https://blog.csdn.net/qq_36777143/article/details/146964833

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017"); 是 PHP MongoDB 扩展中的核心类 ,用于管理与 MongoDB 服务端的连接,并作为执行所有数据库操作的入口点。

一、作用
建立连接

解析连接字符串(如 mongodb://localhost:27017),初始化到 MongoDB 服务端的连接。
支持多种配置(如认证、SSL、副本集、分片集群)。
执行操作

作为底层驱动接口,负责发送命令(如查询、写入、聚合)到 MongoDB 服务端。
管理连接池、请求路由和错误处理。
资源管理

维护持久连接(Persistent Connections),减少重复握手开销。
自动处理节点故障转移(如副本集主节点切换)。
二、使用场景
1. 直接操作底层驱动
场景:需要绕过高层抽象(如 MongoDB\Client),直接执行原生命令或自定义操作。
示例:
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$command = new MongoDB\Driver\Command(["ping" => 1]);
$cursor = $manager->executeCommand("admin", $command);

2. 高性能需求
场景:优化连接复用(如高并发场景),手动管理连接池行为。
配置示例:
$manager = new MongoDB\Driver\Manager(
"mongodb://localhost:27017/?maxPoolSize=200&retryWrites=true"
);

3. 复杂拓扑适配
场景:连接到副本集或分片集群,自动发现节点并处理负载均衡。
连接字符串示例:
$manager = new MongoDB\Driver\Manager(
"mongodb://host1:27017,host2:27017/?replicaSet=myReplicaSet"
);

4. 特殊配置需求
场景:启用 SSL 加密、自定义认证机制(如 LDAP)。
配置示例:
$manager = new MongoDB\Driver\Manager(
"mongodb://user:password@localhost:27017/?tls=true&authMechanism=SCRAM-SHA-256"
);

三、底层原理
1. 连接建立流程
解析连接字符串:

提取主机列表、认证信息、选项(如 maxPoolSize)。
若使用 mongodb+srv://,通过 DNS SRV 记录自动发现节点。
连接池初始化:

每个唯一连接配置对应一个连接池(由 maxPoolSize 控制并发连接数)。
长连接(Persistent Connections)在脚本结束时保留,供后续请求复用。
认证与握手:

通过 SCRAM-SHA-1/256 或其他机制验证用户权限。
协商协议版本(如 OP_MSG 用于 MongoDB 3.6+)。
2. 请求执行机制
命令封装:

每个操作(如 find、insert)被封装为 OP_MSG 协议包。
示例:查询命令的底层结构:
struct OP_MSG {
int32 flags;
cstring command_name; // 如 "find"
document command_args; // 如 {"find": "collection", "filter": {}}
};

负载均衡与路由:

副本集:自动将写操作路由到主节点,读操作根据 readPreference 分发。
分片集群:通过 Mongos 路由定位数据分片。
3. 错误与重试
自动重试:
对于临时错误(如网络中断、主节点选举),驱动自动重试写操作(需 retryWrites=true)。
异常处理:
抛出 MongoDB\Driver\Exception 子类(如 ConnectionTimeoutException)。
四、与高层封装的对比
特性 MongoDB\Driver\Manager 高层封装(如 MongoDB\Client)
抽象层级 低级(直接操作协议) 高级(提供面向对象的 API)
易用性 需手动处理 BSON 编解码 自动封装 CRUD 操作
灵活性 支持自定义命令和配置 限制于预定义方法
适用场景 性能优化、特殊需求 日常开发、快速集成
五、代码示例:底层操作
// 1. 创建 Manager 实例
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");

// 2. 插入数据
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['name' => 'Alice', 'age' => 30]);
$manager->executeBulkWrite('mydb.users', $bulk);

// 3. 查询数据
$query = new MongoDB\Driver\Query(['age' => ['$gt' => 25]]);
$cursor = $manager->executeQuery('mydb.users', $query);
foreach ($cursor as $document) {
var_dump($document);
}

// 4. 执行管理命令(如创建索引)
$command = new MongoDB\Driver\Command([
'createIndexes' => 'users',
'indexes' => [
[
'key' => ['email' => 1],
'name' => 'email_1',
'unique' => true
]
]
]);
$manager->executeCommand('mydb', $command);

总结
MongoDB\Driver\Manager 是 PHP 操作 MongoDB 的底层核心类,负责连接管理和协议通信。它适用于需要高性能、细粒度控制或特殊配置的场景,但日常开发更推荐使用高层封装(如 mongodb/mongodb 库)。
————————————————
版权声明:本文为CSDN博主「快点好好学习吧」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36777143/article/details/146964833