SQLSTATE[HY000] [1040] 连接太多

dev*_*per 4 php mysql database pdo

有时,当我打开错误日志文件时,会看到此错误

[2014 年 6 月 14 日 19:09:55 UTC] PHP 致命错误:未捕获的异常“PDOException”,消息为“SQLSTATE[HY000] [1040] /home/root/products/db.php:2 中的连接过多”

堆栈跟踪:/home/root/products/db.php(2): PDO->__construct('mysql:host=loca...', 'database', 'password')

/home/root/products/by-brand.php(2): include_once('/home/root/...')

{main} 在第 2 行的 /home/root/products/db.php 中抛出

[2014 年 6 月 14 日 19:15:11 UTC] PHP 致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[42000]:语法错误或访问冲突:1286 /home/root/products/detail 中的未知存储引擎 InnoDB .php:8

堆栈跟踪:/home/root/products/name.php(8): PDO->prepare('select * from p...')

{main} 在第 8 行的 /home/root/products/name.php 中抛出

我试图通过使用关闭每个脚本来解决这个问题,$db=null;但它似乎不起作用。

我联系了服务提供商。他们说一切正常。您需要在最后检查错误。我只有几个用户。

为什么我有时会收到此错误?

我的主机是无限的:无限的磁盘空间。无限带宽,但我仍然收到此错误。我不知道我该如何解决这个问题。我希望让我的网站更大,但这些错误让我感到困惑

我的 db.php 文件有这个代码。你能检查一下这是否正常?也许这是导致问题的原因。

数据库文件

$db = new PDO('mysql:host=localhost;dbname=mobiles;charset=utf8', 'root', '**somePassword**');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
Run Code Online (Sandbox Code Playgroud)

fnt*_*ves 13

这是数据库配置的限制。如果您有权编辑数据库服务的配置文件,则可以更改max_connections值。

看一下: http://dev.mysql.com/doc/refman/5.5/en/too-many-connections.html

您可以尝试运行这个 SQL 查询(注意这个值!)

SET GLOBAL max_connections = 512;
Run Code Online (Sandbox Code Playgroud)

这是为了获取所有变量的当前值:

SHOW VARIABLES;
Run Code Online (Sandbox Code Playgroud)

或(对于特定变量):

SHOW GLOBAL VARIABLES LIKE '%max_connections%'
Run Code Online (Sandbox Code Playgroud)

对了,不用的时候尽量设置PDO object为。null这将关闭与数据库的连接,并且 PHP 不会等待脚本完成即可关闭活动连接。(哦,你做到了,抱歉,我不会编辑删除。作为笔记)


Ste*_*eAp 7

在内存不足或资源很少的情况下,首先确定根本原因

您的开发系统中是否出现这个问题?或者它出现在你的生产系统中吗?

如果在开发系统中看到,这很可能是一个严重的技术错误。如果在生产系统中看到,问题可能是由于系统限制(不一定是系统过载)造成的。

大多数服务器应用程序为固定数量的传入连接分配固定数量的 RAM(由于技术优势)。

与大多数其他网络服务器应用程序一样,MySQL 也分配固定数量的连接每次客户端连接时,都会分配连接池中的一个插槽。每次客户端断开连接时,一个插槽就会被标记为空闲

虽然您可以扩大预分配的连接池,但要分小步进行。您的系统管理(希望)已明智地选择了连接池的大小。

如果连接池变得太大,您的应用程序或整个服务器可能会变得无响应:每个计算环境每单位时间只能处理一定数量的请求。该数量取决于每个请求的平均成本/请求上的成本分布。

That said, collect system load and connection amount data over time. 
Figure out, at which situations the error message gets written.
Run Code Online (Sandbox Code Playgroud)

了解后,您可以更改 MySQL 的max_connections设置。

PHP 和 MySQL

正如这里所解释的那样,分配$db = null很好。

关于您的问题场景,磁盘空间和带宽很可能不相关。

一般来说,您可以准备一个符合单例模式的类,它提供与数据库服务器通信的唯一接口。其他模式也可能适用。

所有其他脚本都应该require_once这个类的文件,并使用这个类执行所有与数据库相关的操作。

如果正确实现和调用,单例类对每个处理的请求使用单个 MySQL 连接

设置连接数的正确位置是my.cnf,通常可以在/etc/目录中找到。在那里,您可以像这样设置一个值:

[mysqld]
set-variable=max_connections=250
Run Code Online (Sandbox Code Playgroud)

如果遇到麻烦,SHOW processlist可能会有所帮助。它提供所有活动连接的详细信息:

在此输入图像描述

catch在处理 的顶级块中,您可以将SHOW processlistPDOException的结果保存在日志文件中以供以后分析。但请确保每单位时间的此类日志条目的数量受到限制,以免淹没您的日志文件。

请注意,对于具有SUPER 权限的用户的客户端连接, MySQL 允许比max_connections多一个连接。

您可以使用此类用户来收集进程列表信息。或者 - 在这种情况下PDOException- 您可以将应用程序延迟一小段时间,然后尝试再次连接,然后保存进程列表。

无限磁盘空间

无限磁盘空间之类的东西并不存在:由于一个简单的事实,HDD 和 SSD 的生产量是有限的;-)

虽然您的提供商没有设置限制,但存在技术限制 -这对于您的情况很可能并不重要

实际上,还有另一个限制:编写和运行分配越来越多磁盘空间的应用程序。在很短的时间内,您的提供商将拒绝您的合同......


You*_*nse 6

您的连接代码没有任何问题。

共享主机上,“无限制”意味着其他用户的资源使用不受限制。意味着它们可以吃光整个游泳池,而您的消费量保持适度。

正如您在评论中被告知的那样,不要使用此主机。