php - MySQLi 持久连接填充并发用户

标签 php mysql mysqli

我所在的公司最近将网站的 PHP 代码从 vanilla MySQL 更新为 MySQLi,以领先于弃用更改。

我们在使用 MySQL 在网络级别使用 64k 源 TCP 端口时遇到了一些问题并崩溃了。我们通过启用持久连接来解决这个问题。 但是,我们现在遇到了一个新问题,即我们运行的查询并不总是重用现有连接,最终会填满所有连接槽 (200)。

我们运行的设置是这样的:

我们有多个数据库服务器(开发环境中有 4 个),每个客户端站点都具有复制表和单个数据库,分布在服务器上(每个站点都有自己的架构)以提高性能。

我们有一个自定义查询解析函数,可以确定要连接到哪个主机,选择正确的架构并运行查询。这不是问题,一切正常。

主数据库服务器受到连接的打击,填满然后拒绝任何新连接。

每次页面加载时,每个主机只需要 1 次 mysqli_connect 调用。但由于某种原因,这些连接似乎从未被重用。即使多次刷新同一页面也会为每次加载创建新的连接。

这正常吗?我希望重新加载同一页面并获取相同的数据会重用刷新之前创建的休眠连接。

最佳答案

是的,这很正常。您应该阅读warnings on persistent connections 。第一段通常足以吓跑你。在其他语言中,持久连接可以如您所期望的那样工作。

当你查看db服务器上的mysql进程时,你是否看到很多空闲连接?你可能想减少 mysql wait timeout值来删除空闲连接。我通常对此设置相当积极(30 秒),并且对系统进行了适当的扩展(每天 100 万页面浏览量)。

要真正领先于弃用更改,您应该考虑使用 PDO。无耻插件:我写的my own db class管理连接、按需连接或根据需要重新连接。这允许非常低的超时设置,而不必担心连接断开。

关于php - MySQLi 持久连接填充并发用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25857209/

相关文章:

php - AMFPHP 2.2 后台调用简单有效,但调用 amf 返回 null?

php - 按 id DESC 排序

php - Doctrine 删除 Symfony2 中的问题

php - 向表格的每一行添加编辑按钮以在 PHP 中更新数据库

php - MYSQL 即使我在 php.ini 中定义,连接也超时

PHP 将 html 转换为空格,> 到 > 等

php - 如何在laravel中获取所有月份的记录数

php - 编辑 2 - 用于清除和转义动态 MySQL 中使用的任何变量的 PHP 函数 - 我的代码

php - mysqli 无法向 mysql 数据库插入和更新查询

PHP重启后无法连接MYSQL - Ubuntu 15.10