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 不会等待脚本完成即可关闭活动连接。(哦,你做到了,抱歉,我不会编辑删除。作为笔记)
在内存不足或资源很少的情况下,首先确定根本原因。
您的开发系统中是否出现这个问题?或者它出现在你的生产系统中吗?
如果在开发系统中看到,这很可能是一个严重的技术错误。如果在生产系统中看到,问题可能是由于系统限制(不一定是系统过载)造成的。
大多数服务器应用程序为固定数量的传入连接分配固定数量的 RAM(由于技术优势)。
与大多数其他网络服务器应用程序一样,MySQL 也分配固定数量的连接。每次客户端连接时,都会分配连接池中的一个插槽。每次客户端断开连接时,一个插槽就会被标记为空闲。
虽然您可以扩大预分配的连接池,但要分小步进行。您的系统管理(希望)已明智地选择了连接池的大小。
如果连接池变得太大,您的应用程序或整个服务器可能会变得无响应:每个计算环境每单位时间只能处理一定数量的请求。该数量取决于每个请求的平均成本/请求上的成本分布。
Run Code Online (Sandbox Code Playgroud)That said, collect system load and connection amount data over time. Figure out, at which situations the error message gets written.
了解后,您可以更改 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 的生产量是有限的;-)
虽然您的提供商没有设置限制,但存在技术限制 -这对于您的情况很可能并不重要。
实际上,还有另一个限制:编写和运行分配越来越多磁盘空间的应用程序。在很短的时间内,您的提供商将拒绝您的合同......
您的连接代码没有任何问题。
在共享主机上,“无限制”意味着其他用户的资源使用不受限制。意味着它们可以吃光整个游泳池,而您的消费量保持适度。
正如您在评论中被告知的那样,不要使用此主机。