PHP mysql持久连接未重用(每个fpm-worker打开多个连接)

时间:2017-09-04 16:20:06

标签: php mysql curl nginx pdo

在测试从php到mysql的持久连接时,我面临着一种非常奇怪的行为。我有一个小脚本,如下所示:

<?php
   $db  = new mysqli('p:db-host','user','pass','schema');
   $res = $db->query('select * from users limit 1');
   print_r($res->fetch_assoc());

我的设置是:

  • OS:CentOS 7.3
  • PHP / 7.1.18
  • PHP-FPM
  • 的nginx / 1.10.2
  • 的MySQL - 30年6月5日

我试图用ab:

做一些请求
$ ab -c 100 -n 500 http://mysite/my_test_script.php

PHP-FPM配置为准备好150名工作人员,我看到了我所期待的,150个与mysql建立的连接,在ab完成后保持打开状态。我再次启动了ab,行为仍然是相同的,150个连接,没有打开的新连接。一切都很好。然后我创建了一个脚本,它执行相同的确切请求,相同的IP,相同的HTTP标头,但使用curl来发出请求,而BOOM我在mysql而不是150上有300个连接。我再次启动了脚本,我还有300个连接。后续运行相同的脚本并没有增加连接数。有没有人遇到过这样的事情?有谁知道什么可以使PHP打开更多的连接而不是需要?我错过了一些明显的东西吗?

如果我不清楚我在问什么,请在下面评论,我会尽力解释我的问题。

P.S。我也尝试过用PDO,同样的行为。

编辑:我的测试不准确

经过进一步测试后,我注意到我的第一次测试不准确。我处于多租户环境和不同的连接(不同的架构),当我启动ab时初始化。在我的情况下,php文档有点误导,它说:

  

PHP检查是否已经存在相同的持久连接(从之前保持打开状态) - 如果存在,则使用它。如果它不存在,则创建链接。一个相同的&#39; connection是打开到同一主机的连接,具有相同的用户名和相同的密码(如果适用)。

http://php.net/manual/en/features.persistent-connections.php

也许我对每个人都很明显,我不知道,这不适合我。将第4个参数传递给mysqli使php认为连接 不相同 。一旦我将代码改为这样的代码:

<?php
  $db  = new mysqli('p:db-host','user','pass');
  $db->select_db('schema');
  $res = $db->query('select * from users limit 1');
  print_r($res->fetch_assoc());

应用程序开始按我的预期运行,每个工作一个连接。

0 个答案:

没有答案