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

时间:2016-10-22 20:04:54

标签: php mongodb mongodb-php

对于一个项目,我正在使用PHP的新MongoDB驱动程序(参见: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

1 个答案:

答案 0 :(得分:1)

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

  

自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。

这种反应很快就会过时......