0

0

MongoDB php driver 简要分析

php中文网

php中文网

发布时间:2016-06-07 16:34:31

|

1329人浏览过

|

来源于php中文网

原创

关于连接、连接池、长连接、短连接 连接池。PHP MongoDB driver 版本( 1.2.0-1.2.12 only )使用连接池(Connection Pooling) 1.1.4及之前版本可以选择使用短连接或者长连接 举个简单的例子,写段程序连接1000次数据库: ?phpfor ($i=0; $i 需要将近18秒; 使

关于连接、连接池、长连接、短连接
连接池。php mongodb driver 版本( 1.2.0-1.2.12 only)使用连接池(connection pooling)

1.1.4及之前版本可以选择使用短连接或者长连接
举个简单的例子,写段程序连接1000次数据库:

<?php
for ($i=0; $i

需要将近18秒;
使用长连接

<?php
for ($i=0; $i "x"));
}
?>

小于0.02秒。

1.2.x 使用连接池,所有连接都是长连接,驱动自动管理。使用长连接的直接原因是效率高。因为连接复用而省去了大量的创建连接的开销。长连接由PHP进程维护。
在执行任何查询时,都会从连接池中请求一个连接,完成之后再归还给连接池。这里的完成是指持有该连接的变量离开了它的作用域。

立即学习PHP免费学习笔记(深入)”;

1.3以后连接管理做了很大改动,抛弃了连接池,连接均为长连接。
每个worker进程(线程、PHP-FPM或Apache worker)中,驱动把连接管理和Mongo*对象分离,降低驱动的复杂度
当一个worker进程启动,MongoDB驱动会为之初始化连接管理器管理连接,并且默认没有连接。
在第一个请求调用new MongoClient();时,驱动创建一个新连接,并且以一个哈希值标识这个连接。
这个哈希值包括以下参数:主机名、端口,进程ID和可选的replica set名,
如果是密码验证的连接,则还包括数据库名、用户名和密码的哈希值(对于密码验证的连接,我们后面再详细讨论)。
调用MongoClient::getConnections()方法,可以查看连接对应的哈希值
然后该连接会在连接管理器中注册:
在需要连接的任何时候,包括插入、删除、更新、查找或执行命令,驱动都会向管理器请求一个合适的连接来执行。
请求连接时会用到new MongoClient()的参数和当前进程的ID。每个worker进程/线程,连接管理器都会有一个连接列表,
而每个PHP worker同一时刻,只会运行一个请求,因此和每个MongoDB之间只需要一个连接,不断重用,
直到PHP worker终止或显式调用MongoClient::close()关闭连接。

源码简要分析,版本mongo-php-driver-1.4.5
连接初始化及连接管理
连接管理器(manager)初始化:
模块初始化的时候也就是在PHP_GINIT_FUNCTION()里面,初始化连接管理器。
php_mongo.c L288 mongo_globals->manager = mongo_init(); mongo_init()定义在mcon/manager.c L622
mongo_init() 初始化建立连接(socket连接)。

连接管理器与MongoClient分离,下面看MongoClient初始化:
mongoclient.c L338

magento(麦进斗)
magento(麦进斗)

Magento是一套专业开源的PHP电子商务系统。Magento设计得非常灵活,具有模块化架构体系和丰富的功能。易于与第三方应用系统无缝集成。Magento开源网店系统的特点主要分以下几大类,网站管理促销和工具国际化支持SEO搜索引擎优化结账方式运输快递支付方式客户服务用户帐户目录管理目录浏览产品展示分析和报表Magento 1.6 主要包含以下新特性:•持久性购物 - 为不同的

下载
PHP_METHOD(MongoClient, __construct)
{
 php_mongo_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
}

php_mongo_ctor主要工作:
指定连接管理器为上面的全局管理器;
解析连接的一些参数设置,如主机,端口,选项w等等,
调用php_mongo_connect()函数
php_mongo_connect()函数定义在mongoclient.c L275
php_mongo_connect()主要调用mongo_get_read_write_connection()函数(mcon/manager.c L415)
来获得合适的连接;
mongo_get_read_write_connection()主要工作是获得合适的连接:
根据单机、复制集、mongos以及不同读写分离设置获取到合适的连接
代码对应
STANDALONE 调用mongo_get_connection_multiple(定义mcon/manager.c L319)
REPLSET mongo_get_read_write_connection_replicaset()(mcon/manager.c L249)
multiple(mongos类型在这里处理) mongo_get_connection_multiple()

获取连接及读写分离
在mcon/parse.c L457 处理replicaSet选项
L483 设置了servers->options.con_type = MONGO_CON_TYPE_REPLSET
MongoClient的__construct()和connect()里面会调用php_mongo_connect()函数
php_mongo_connect()函数定义在mongoclient.c L275
在mongo_connection()里面调用mongo_get_read_write_connection()函数
mongo_get_read_write_connection()函数定义在mcon/manager.c L415
在mongo_get_read_write_connection()里面判断了servers->options.con_type
对于replica sets,调用mongo_get_read_write_connection_replicaset()
mongo_get_read_write_connection_replicaset()定义在mcon/manager.c L249
在mongo_get_read_write_connection_replicaset()里面调用了mongo_discover_topology()去探测服务器
mongo_discover_topology()的实现在mcon/manager.c L144 ,
mongo_discover_topology()->mongo_connection_ismaster(mcon/manager.c L167)
->bson_create_ismaster_packet(mcon/mini_bson.c L86)->执行isMaster命令

replica sets
根据read preference设置,查出候选servers.
调用mongo_find_candidate_servers(mcon/read_preference.c L319)
调用mongo_find_all_candidate_servers (mcon/read_preference.c L135)
PRIMARY 找PRIMARY
PRIMARY_PREFERRED 不处理
SECONDARY_PREFERRED 找PRIMARY和SECONDARY
SECONDARY 只找SECONDARY
NEAREST 找所有类型
调用mongo_filter_candidates_by_replicaset_name(mcon/read_preference.c L211),根据复制集名称过滤;
调用mongo_filter_candidates_by_credentials (mcon/read_preference.c L270) 根据db,username,password认证,通过验证的添加到候选连接里。
调用mongo_sort_servers (mcon/read_preference.c L424)根据read preference的几种设置选项对于的排序算法,基本都是按照 ping time来排序。
调用mongo_select_nearest_servers(mcon/read_preference.c L461),
如果read preference设置的是PRIMARY,PRIMARY_PREFERRED,SECONDARY,SECONDARY_PREFERRED,NEAREST;
选择ping值最低的作为第一个元素,距最低的ping值15ms内的成员都添加进去。
调用mongo_pick_server_from_set (mcon/read_preference.c L510)
PRIMARY_PREFERRED,
根据上面的排序选择结果,如果第一个是PRIMARY(一般是),选择PRIMARY,
(当然选择如果第一个不是PRIMARY,即无主的情况,进入下面的随机选择(rand()),随机选一个复制集成员;
SECONDARY_PREFERRED,
根据上面的排序选择结果,如果大于1个,如果最后一个是PRIMARY,随机选择除PRIMARY之外SECONDARY的成员;
(当然如果只有1个了,跳到下面的随机选择步骤,选择的是PRIMARY)
随机选择,这里不管read preference设置,包含SECONDARY和nearest,
SECONDARY和nearest区别是nearest把PRIMARY当做其他secondaries一样。
nearest不是选择ping值绝对最低的那一个,而是包含绝对最低的+15ms内的组合里(如果到这个阶段不止一个的话)随机选择一个。

mongos
调用mongo_get_connection_multiple(mcon/manager.c L319)
调用mongo_get_connection_single( mcon/manager.c L55),测试连通性
调用mongo_find_candidate_servers (mcon/read_preference.c L319)->
调用mongo_filter_candidates_by_seed ( mcon/read_preference.c L245 ) 连接生成hash,
比较seed列表里hash与servers里的hash,返回相等的。
调用mongo_filter_candidates_by_credentials (mcon/read_preference.c L270) 根据db,username,password认证
通过验证的添加到候选连接里。
调用mongo_sort_servers (mcon/read_preference.c L424)根据read preference的几种设置选项对于的排序算法,基本都是按照
ping time来排序。
调用mongo_select_nearest_servers(mcon/read_preference.c L461),选择ping值最低的。
Hash格式:

  • HOST:PORT;-;.;PID
    或者
  • HOST:PORT;REPLSETNAME;DB/USERNAME/md5(PID,PASSWORD,USERNAME);PID

简单总结
对给出的mongos连接串,逐个去建立连接,测试连通性,如果都连不通,退出;
对这些连接做一下过滤与验证,对合格的连接根据ping值选择最快的来连接。
所以对于mongos来说,如果只提供一个连接,是不能找到其他mongos的。这与replica sets不同,
对于replica sets,任意一个数据成员可以找到其他所有数据成员。

参考:
http://mongodb.github.io/node-mongodb-native/driver-articles/anintroductionto1_1and2_2.html
http://emptysqua.re/blog/reading-from-mongodb-replica-sets-with-pymongo/
http://docs.mongodb.org/manual/core/read-preference-mechanics/
http://wulijun.github.io/2012/12/10/mongodb-php-driver-connectiong-handling.html
http://derickrethans.nl/mongodb-connection-handling.html
http://www.php.net/manual/zh/mongo.connecting.persistent.php

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

3

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

12

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

69

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

59

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

46

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

24

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

20

2026.02.27

Golang 测试与调试专题:确保代码可靠性
Golang 测试与调试专题:确保代码可靠性

本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。

4

2026.02.27

漫蛙app官网链接入口
漫蛙app官网链接入口

漫蛙App官网提供多条稳定入口,包括 https://manwa.me、https

348

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MongoDB 教程
MongoDB 教程

共17课时 | 3.1万人学习

黑马云课堂mongodb实操视频教程
黑马云课堂mongodb实操视频教程

共11课时 | 3.2万人学习

MongoDB 教程
MongoDB 教程

共42课时 | 33.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号