繁体   English   中英

在 MySQL 中使用持久连接但仍然有许多打开的连接

[英]Using persistent connections in MySQL but still many open connections

我有一个用于回调 api 的聊天机器人,每次有人写消息时它都会在我的服务器上发送一个请求

最近,我读到了所谓的持久连接,这让我觉得每次在服务器上收到请求时都可以避免重新连接到数据库,因为数据库加载需要一些时间,我想加快该过程

因此,我已将脚本中的任何连接更改为具有p:前缀,如下所示

$conn = new mysqli("p:".$servername, $username, $password, $dbname);

据我所知,这样 mysqli 会找到一个具有相同参数的现有连接,或者如果它不存在则创建一个,而不是每次都打开一个新连接

但是,几个小时后,我检查了打开的连接,我注意到一堆类似的连接,只是它们的ID不同,就像这样

  ID      | USER | HOST      | DB       | COMMAND | TIME | STATE | INFO |
+---------+------+-----------+----------+---------+------+-------+------+
| 5248403 | user | localhost | database | Sleep   |   24 |       | NULL |
| 5248609 | user | localhost | database | Sleep   |  113 |       | NULL |
| 5247822 | user | localhost | database | Sleep   |    1 |       | NULL |
| 5248652 | user | localhost | database | Sleep   |   79 |       | NULL |

userdatabase屏蔽了实际用户和数据库)


我对持久连接有什么误解吗? 我该怎么做才能避免类似的连接?

持久连接可以被后续请求重用,但如果您的站点正在处理多个并发请求,它们每个都需要自己的连接。

换句话说,多个并发 PHP 请求不能同时使用同一个数据库连接。

MySQL处理多个连接不是问题。 MySQL 8.0 中默认的max_connections限制设置为 151,但如果您的服务器足够强大,它可以更高。 在我的工作中,我们使用高端数据库服务器,因此我们将max_connections提高到 4096。但我们提醒开发人员,他们可能不希望它超过 1024。通常我们看到连接数保持在几百个。

一个教科书般的XY问题

数据库加载需要一些时间,我想加快这个过程

我有一种感觉,如果有的话,持久连接将是解决问题的最后选择。

据我所知,这样 mysqli 会找到一个具有相同参数的现有连接,或者如果它不存在则创建一个,而不是每次都打开一个新连接

实际上远非如此。 PHP 中的持久连接绑定到 PHP 在其中执行的多个线程。每个碰巧打开连接的线程将保持它进一步打开,为将要执行的脚本提供这个已经打开的连接。 表示持久连接是持久的,或者换句话说,持久打开。

因此,您可以看到的图片是预期的。

只要您没有遇到“连接过多”的错误,就可以了,尽管我怀疑使用持久连接是否有明显的好处。

我猜这是连接池。 在您的情况下,它创建了一个包含 4 个连接的池,可用于并行处理 4 个请求/查询。 如果您只有 1 个连接并且正在其上运行查询,则任何其他需要数据库的请求都必须等待。

另一种解释可能是您的 Web 服务器正在运行 4 个子进程来并行处理多个请求,因此每个子进程创建/获取它自己的连接,它可以在内部重用

这可以说适用于许多其他网络服务器/框架,而不是特定于 php/mysqli

是的,我相信你有点误解了什么是持久连接。

我明白了,这样 mysqli 会找到一个具有相同参数的现有连接,或者如果它不存在就创建一个,而不是每次都打开一个新连接

当您使用持久连接时,PHP 不会在 PHP 脚本结束执行时请求关闭连接。 相反,连接将保持活动状态,如果处于空闲状态,PHP 可能会再次重用该连接。

无论如何,同一脚本的每次执行都需要一个单独的连接。 如果没有可重用的连接,那么 PHP 将尝试打开一个新的持久连接。

这只是灾难的一个秘诀。 如果您没有正确手动清理连接,您会看到一些奇怪的行为。 如果您不需要使用它们,最好远离它们。 使用持久连接只能使您更快地达到max_connections限制。

如果您在 localhost 上使用 MySQL,这似乎是这种情况,您不会看到太多的性能提升。 几乎没有理由进行如此小的优化。 打开和关闭连接通常是一个非常快速的过程,尤其是在本地主机上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM