【问题标题】:Mysql connections too manyMysql连接太多
【发布时间】:2017-12-27 12:09:31
【问题描述】:

我正在准备带有彗星风格编程的聊天系统。它会延迟(睡眠)页面 60 秒,我在这个循环中使用 mysql 查询,它大约向 mysql 发送了 245.000 个查询。 Mysql状态如下:

Aborted_connects - 179391
Connections - 15673040
Max_used_connections - 59
Threads_connected - 6

连接选项卡可能是 1500 万个问题,但我无法杀死它们。我可以在while() 末尾添加mysql_close 来解决这个问题吗?

set_time_limit(60);
mysql_connect("...");
while(true){
  usleep(60000);
  clearstatcache();
  mysql_query("...");
  mysql_close();//<= this one
}

【问题讨论】:

  • 很奇怪...你在这段代码中连接了一次,所以请指定代码失败的部分。
  • 不,由于 while 循环在 60 秒内,此代码运行 mysql 245.000 次

标签: php mysql comet


【解决方案1】:

事情很少。

  1. 您的代码以某种方式过多地连接到 mysql。调试您的代码。
  2. 尝试共享您的连接。阅读此Connection pooling in PHP

【讨论】:

  • 不需要关闭mysql连接。您可以反复使用相同的连接。无需每次都连接mysql。不幸的是,MySQL 池不直接在 PHP 上可用
  • 在一段时间后我没有使用 mysql_close bu 之前,我收到错误 max_user_connections to many 并停止 mysql,并在这个问题中询问“我可以解决这个问题,将 mysql_close 添加到 @ 的末尾987654324@?”
  • 您只连接一次。然后您使用相同的实例来更新/插入。看看你在什么时候调用 mysql_connect 并检查它是否被重复调用。
  • 可能问题是我需要(“db.php”)并且运行了很多次,是这个问题吗?
  • 在我使用的每一页中require("db.php");
【解决方案2】:

看到你的代码和你的问题,我们应该考虑和区分connectionquery

在while true循环上关闭连接是没有用的,是错误的。

你的代码应该是这样的:

mysql_connect("...");
while(true){
  //do stuff like:
  mysql_query("...");
}
//in case of we exit while true...
mysql_close();//<= this one

如果我们阅读 mysql_close 手册,我们可以找到:

通常不需要使用 mysql_close(),因为非持久打开 链接在脚本执行结束时自动关闭。

所以,现在,不要考虑何时关闭 mysql_connection。我们应该看到连接是如何创建的以及在哪里创建的。

我建议您检查一下您的 MySQL 并对其进行调试。您可以使用以下命令:

show status where `variable_name` = 'Threads_connected';

通过它您可以检查当前的连接。您也可以检查:

show processlist;

你会看到所有的进程列表。

也许我们可以开始调试并找到问题:)

【讨论】:

    猜你喜欢
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 2010-11-15
    • 2020-01-24
    • 2017-10-29
    • 2014-09-08
    相关资源
    最近更新 更多