【问题标题】:Error "too many connections" on CodeIgniter websiteCodeIgniter 网站上的错误“连接太多”
【发布时间】:2018-11-09 12:49:10
【问题描述】:

我已经阅读了关于堆栈溢出的所有关于这个主题的问题/答案,但不幸的是,没有人能解决我的问题。

在过去的几天里,mysql 错误“连接太多”不断出现在网站日志上,并且它会为每个客户端挂起整个网站。实际上它会挂起服务器上的所有网站。

所以这是我的问题/评论:

  • 大约有 50 个不同的客户端数据库,除了 2 个对所有客户端通用
  • pconnect 已经 = 所有连接都为 FALSE
  • 在文件“php.ini”上,变量“allowpersistent”为ON。即使我写 pconnect = FALSE,这是否会使 mysql 连接永久化? (我无法更改“allowpersistent”变量,必须询问托管公司)
  • 有3个文件加载数据库,一个加载客户端的数据库,另外两个加载所有客户端的公共数据库,它们在每个模型的构造方法上调用,但是CI应该在完成后关闭mysql连接他们并忽略任何已经加载的“加载->数据库”
  • "db->close" 显然什么都不做,因为 this->db->database 在我关闭它后保持它的值:P
  • 在我写这篇文章时,Threads_connected 高达 1000 并且网站已关闭 :(
  • mysql配置有max_connections = 1000,可以再增加吗?我发现可用内存没有变化,那么会发生什么?
  • 我应该改为 PDO 吗?我正在使用 dbdriver "mysqli"
  • 是否应该要求托管公司降低mysql变量'wait_timeout',以便快速关闭DB连接?
  • 我应该更新 CodeIgniter 吗?我有 3.1.4 版本,现在是 3.1.9

非常感谢您的帮助!

【问题讨论】:

  • 我认为它终于解决了,但我会在接下来的几个小时内检查并在确认后自己发布答案。托管公司已将 mysql 进程的 wait_timeout 从 8 小时(默认)调整为 3 分钟。

标签: php mysql codeigniter


【解决方案1】:

在我们的例子中,解决方案是将 mysql 变量“wait_timeout”从 8 小时(默认值,wtf!?)降低到 180 秒。如果需要,它仍然可以降低更多。这必须由托管公司完成,因为我们没有对服务器的 root 访问权限。

我在问题中提到的所有其他解决方案都不起作用,例如“pconnect = false”和“db->close”。

“Threads_connected”现在总是低于 100 或 200,而不是在此修复之前几乎是 1000。

我的团队为这个问题苦苦挣扎了两天,网上有很多人在寻求解决方案,但没有任何(有效的)答案。

干杯:)

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题。当我使用此查询检查 MySQL 中当前的活动连接数时:

    show processlist
    

    睡眠模式下的连接太多了。找了一圈,才发现:

    创建数据库连接时,也会同时在数据库服务器上创建会话,但如果该连接和会话未正确关闭,则等待时间结束后查询进入睡眠模式。

    为了解决这个问题,我作为@Pedro,通过在mysql中运行这个命令将wait_timeout更改为180:

    SET GLOBAL wait_timeout = 180;
    

    使用此方法,无需重启mysql服务即可生效。

    您可以在这里阅读更多内容:https://www.znetlive.com/blog/what-is-sleep-query-in-mysql-database/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-04
      • 2015-08-06
      • 2013-06-02
      • 1970-01-01
      • 2016-08-16
      • 2010-11-15
      • 2017-10-29
      • 1970-01-01
      相关资源
      最近更新 更多