Laravel 5.4 和 Mariadb 的连接错误太多
Posted
技术标签:
【中文标题】Laravel 5.4 和 Mariadb 的连接错误太多【英文标题】:Too many connections error with Laravel 5.4 and Mariadb 【发布时间】:2017-10-30 02:09:51 【问题描述】:我最近将我的 laravel 应用从 5.1 升级到了 5.4。我的服务器现在使用 php 7 和 Maria db 10.1.22。现在我遇到了一个非常奇怪的错误。有时,我只是尝试刷新我的浏览器,PHPMyAdmin 会显示#1040 - Too many connections
。其他时候我会点击我的应用程序上的一个新链接,然后会得到同样的错误。我在互联网上做了一些研究并执行了以下命令:
show variables like 'max_connections`
上面的命令给了 100。然后我增加到 500。
但现在我仍然得到错误。这对我来说很奇怪,因为我在另一台服务器上安装了 oracle mysql 5.6 并且 max_connections 是 151 并且一年半以来我没有遇到过这个错误。
当我运行命令show processlist
时,我得到下面的结果并且这个结果不断增加。这正常吗?
Mariadb 可能有什么问题,我该如何解决。
【问题讨论】:
奇怪!这是记录在 laravel 日志文件中吗?你能检查堆栈跟踪吗? 【参考方案1】:我不确定你们是否找到了解决方案,但我也遇到了同样的问题并找到了解决方案。当我们将 laravel 应用程序从 5.2 升级到 5.4 时,我们错过了一些重要的事情。 php artisan queue:work 也升级了。
在 laravel 5.2 中,当我们执行 queue:work.它一次只处理一项工作,但在 laravel 5.4 queue:work 为您的队列创建一个连接并保持连接。因此,如果您的 cron 中有 queue:work 以每分钟运行一次,它将每分钟创建一个新连接,这就是我们收到连接过多错误的原因。
我没有在 laravel 5.4 文档中找到此信息。我正在通过php artisan查看queue:work的描述,发现描述被改变了。
这是 laravel 5.2 中的描述:
queue:work >>>> 处理队列中的下一个作业
这是 laravel 5.4 中的描述
queue:work >>>> 开始作为守护进程处理队列中的作业
如您所见,它们的用途有所不同。
希望对你有所帮助。
谢谢。
【讨论】:
您好,感谢您的回答。几个月前我找到了答案。刚刚忘记发布答案了。 您好,有什么解决办法?不执行队列:每分钟在 cron 中工作,但只启动一次守护进程?谢谢 如何在 laravel 7 中为队列设置 cron 作业。请帮忙,我也遇到了这个错误。【参考方案2】:您使用的是什么网络服务器。如果是 Apache,那么MaxRequestWorkers(以前称为MaxClients
)的设置是什么?一般不超过20左右。
如果设置为大于max_connections
,这将解释您所看到的。
【讨论】:
嗨 @Rick James 我正在使用 Apache。我在 httpd.conf 文件中找不到 MaxClient。请问它在哪里 嗨@Rick James。我检查过。MaxRequestWorkers: 150
和 max_connections: 151
这比我想要的要紧。我很惊讶 500 并没有解决问题。也许我看错了方向。是否只有一台 Apache 服务器?有什么东西在做“连接池”吗?
只有一台 Apache 服务器。我有一个每分钟运行一次的 cron 条目来执行我的计划命令。当我执行show processlist
时,我看到我的数据库被多次列出,并且“命令”列的值重复睡眠。
150 来自 Apache + 1 来自 cron + 1 来自你观看 > 151。【参考方案3】:
也许这是一个愚蠢的观察,但是您是否使用DB::disconnect('foo')
关闭了您的数据库的连接?
反正db会自动关闭,所以问题可能出在其他地方,你试过监控吗?
监控 MySQL 的一个非常强大的工具是innotop
。你可以在这里找到它:
https://github.com/innotop/innotop
查看this
【讨论】:
以上是关于Laravel 5.4 和 Mariadb 的连接错误太多的主要内容,如果未能解决你的问题,请参考以下文章