CodeIgniter网站上出现“连接过多”错误

时间:2018-11-09 12:49:10

标签: php mysql codeigniter

在堆栈溢出的情况下,我已经阅读了有关此主题的所有问题/答案,但是很遗憾,没有一个问题可以解决我的问题。

在最近几天,mysql错误“连接过多”一直显示在网站日志中,并为每个客户端挂起了整个网站。实际上,它会将服务器上的所有网站挂起。

这是我的问题/评论:

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

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

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

我在问题中提到的所有其他解决方案均无效,例如“ pconnect = false”和“ db-> close”。

“ Threads_connected”现在始终低于100或200,而不是此修复之前的近1000。

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

干杯:)

答案 1 :(得分:0)

我也遇到同样的问题。当我通过以下查询检查MySQL中当前的活动连接数时:

show processlist

在睡眠模式下有很多连接。搜寻后,我发现:

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

要解决此问题,我以@Pedro身份执行,通过在mysql中运行以下命令将wait_超时更改为180:

SET GLOBAL wait_timeout = 180;

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

您可以在此处了解更多信息:https://www.znetlive.com/blog/what-is-sleep-query-in-mysql-database/