当前位置:首页 > PHP教程 > PHP总结归纳

MongoDBPHPDriver的连接处理

mongodb php driver的连接处理 1.3版本的php mongodb driver重写了连接处理库,和以前版本相比,在持久连接和连接池方面,都有了重大的变化。 1.2版本的连接管理 1.2版本的驱动引入了连接池,在执行任何查询时,都会从连接池中请求一个连接,完成之后再归还

mongodb php driver的连接处理

1.3版本的php mongodb driver重写了连接处理库,和以前版本相比,在持久连接和连接池方面,都有了重大的变化。

1.2版本的连接管理

1.2版本的驱动引入了连接池,在执行任何查询时,都会从连接池中请求一个连接,完成之后再归还给连接池。这里的完成是指持有该连接的变量离开了它的作用域,下面是一个示例。

最简单的版本:

← $m离开作用域,连接归还给连接池

在函数中:

在某些情况下,系统可能会产生大量的连接,比如在orms/odms的某个复杂结构中引用连接对象,如下例子:

1.3版本的连接管理

在1.3版本中,连接管理做了很大改动。每个worker进程(线程、php-fpm或apache worker)中,驱动把连接管理和mongo*对象分离,降低驱动的复杂度。下面以单个节点的mongodb实例来说明驱动如何处理连接。

当一个worker进程启动,mongodb驱动会为之初始化连接管理器管理连接,并且默认没有连接。

在第一个请求调用new mongoclient();时,驱动创建一个新连接,并且以一个哈希值标识这个连接。这个哈希值包括以下参数:主机名、端口,进程id和可选的replica set名,如果是密码验证的连接,则还包括数据库名、用户名和密码的哈希值(对于密码验证的连接,我们后面再详细讨论)。调用mongoclient::getconnections()方法,可以查看连接对应的哈希值:

输出:

string(22) "whisky:27017;-;x;22835"

输出中的"-"表示该连接不属于某个replica set,"x"是没有用户名、数据库和密码时的占位符,22835是当前进程的进程id。

然后该连接会在连接管理器中注册:

在需要连接的任何时候,包括插入、删除、更新、查找或执行命令,驱动都会向管理器请求一个合适的连接来执行。请求连接时会用到new mongoclient()的参数和当前进程的id。每个worker进程/线程,连接管理器都会有一个连接列表,而每个php worker同一时刻,只会运行一个请求,因此和每个mongodb之间只需要一个连接,不断重用,直到php worker终止或显式调用mongoclient::close()关闭连接。

replica sets

在存在复制集的环境中,情形有点不一样。new mongoclient()的连接字符串中,需要指定多个hosts,并标示当前正在实用复制集:

$m = new mongoclient("mongodb://whisky:13000,whisky:13001/?replicaset=seta");

其中的replicaset参数不能省略,否则驱动会认为你是准备连接三个不同的mongos进程。

在实例化时,驱动会检查复制集的拓扑结构。下面例子的输出,显示在调用new mongoclient()之后,复制集中所有可见的数据节点都会在管理器中注册一个连接:

输出:

whisky:13001;seta;x;32315 whisky:13000;seta;x;32315

虽然连接字符串中没有whisky:13000节点,但是管理器中已经注册了两个连接:

管理器不仅包含连接的哈希值和tcp/ip socket,还保存哪个节点是主节点,以及每个节点的“距离"。下面的脚本显示了这些额外的信息;


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!