持久连接与新的Mongo PHP驱动程序


Persistent connections with new Mongo PHP driver

对于一个项目,我使用新的MongoDB驱动程序PHP与库(见:https://docs.mongodb.com/php-library/master/),而不是遗留的一个。

我们正在运行PHP 7作为FPM。

我最近用XDEBUG做了一些分析,发现第一个数据库查询明显比第二个慢,例如

Session::validate -> Account::find 38ms
getProfile        -> Account::find 2ms

其中Account::find将执行查询以通过其_id获取一个文档,并且两个调用查找不同的文档。

我的两个问题

  1. 我的理解是,第一个查询比第二个查询慢得多,因为驱动程序必须与数据库服务器建立连接,在我们的情况下还必须进行身份验证。该连接不会在脚本执行之间持久化。对吗?
  2. 如果(1)为真,是否有办法与新驱动程序保持连接?从我的理解来看,用旧的驱动程序连接到数据库可以存储在请求之间。(http://php.net/manual/de/mongo.connecting.persistent.php)

有人在github上指向这个网站,所以我现在可以回答我自己的问题。引用:

自1.2.0以来的所有版本的驱动程序都在PHP工作进程中持久化»libmongoc客户端对象,这允许它在多个请求中重用数据库连接,身份验证状态和拓扑信息。

但:

1.2.0之前的PHP驱动程序使用PHP的Streams API进行数据库连接,使用libmongoc中的API为套接字通信指定自定义处理程序;但是,为每个MongoDB'Driver'Manager创建一个新的libmongoc客户端。因此,驱动程序持久化单个数据库连接,而不是身份验证状态或拓扑信息。这意味着驱动程序需要在每个请求开始时发出命令来验证和»发现服务器拓扑。

由于撰写本文时最新的稳定驱动程序版本是1.1.9,因此身份验证信息不会被持久化。但是,您可以升级到1.2.0 alpha版本,这可以大大加快连接过程,正如我在系统上的一些测试中发现的那样。目前1.2.0 alpha版本有一些已知的bug,所以我将继续使用较慢的1.1.9。