有时当我打开我的错误日志文件时,我会看到此错误
[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-> __构造(' mysql:host = loca ...','数据库','密码')
/home/root/products/by-brand.php(2):include_once(' / home / root /... 39;)
在第2行的/home/root/products/db.php中抛出{main}
[2014年6月14日19:15:11 UTC] PHP致命错误:未捕获异常' PDOException' with message' SQLSTATE [42000]:语法错误或访问 违规:1286未知存储引擎InnoDB in /home/root/products/detail.php:8
堆栈追踪:/home/root/products/name.php(8):PDO->准备('选择* 来自p ...')
第8行/home/root/products/name.php中抛出{main}
我试图通过使用$db=null;
关闭每个脚本来解决此问题,但它似乎无法正常工作。
我联系了服务提供商。他们说一切正常。您需要在最后检查错误。我只有几个用户。
为什么我有时会收到此错误?
我的托管是无限的:无限的磁盘空间。无限的带宽,但我仍然得到这个错误。我不知道如何解决这个问题。我希望我的网站更大,但这些错误让我感到困惑
我的db.php文件包含此代码。你能检查一下这个吗?也许这会导致问题。
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);
答案 0 :(得分:3)
这是数据库配置的限制。如果您有权编辑数据库服务的配置文件,则可以更改max_connections
值。
看看: http://dev.mysql.com/doc/refman/5.5/en/too-many-connections.html
您可以尝试运行此SQL查询(请注意此值!)
SET GLOBAL max_connections = 512;
这是获取所有变量的当前值:
SHOW VARIABLES;
或(对于特定变量):
SHOW GLOBAL VARIABLES LIKE '%max_connections%'
顺便说一句,如果您不需要,请尝试将PDO object
设置为null
。这将关闭与数据库的连接,PHP不会等待脚本完成以关闭活动连接。 (哦,你做了,对不起,我不会编辑删除。把它作为一个注释)
答案 1 :(得分:3)
在内存不足或资源不足的情况下,首先确定根本原因。
您的开发系统中是否出现此问题?或者它出现在您的生产系统中?
如果在开发系统中看到,很可能是严重的技术错误。如果在生产系统中看到,问题可能是由于系统限制(不一定是系统过载)。
大多数服务器应用程序为固定数量的传入连接分配固定数量的RAM(由于技术优势)。
与大多数其他网络服务器应用程序一样, MySQL也会分配固定数量的连接。每次客户端连接时,连接池中的插槽都会分配。每次客户端断开连接时,插槽都会标记为空闲。
虽然您可以扩大预先分配的连接池,但可以通过小步骤执行此操作。您的系统管理(希望如此)明智地选择了连接池的大小。
如果连接池太大,您的应用程序 - 或整个服务器 - 可能无响应:每个计算环境只能每单位时间处理一定数量的请求。该数量取决于每个请求的平均成本/成本与请求的分配。
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
可以正常为explained here。
关于您的问题场景,磁盘空间和带宽很可能不相关。
通常,您可以准备一个符合singleton pattern的类,该类提供与您的数据库服务器对话的唯一接口。其他模式也可能适用。
所有其他脚本应 require_once 此classe的文件,并使用此类执行所有与数据库相关的内容。
正确实现和调用,单例类使用每个请求单个MySQL连接进行处理。
设置连接数的正确位置是my.cnf
,通常位于/etc/
目录中。在那里,您可以设置如下值:
[mysqld]
set-variable=max_connections=250
如果遇到问题,SHOW processlist可能会有所帮助。它提供了所有活动连接的详细信息:
在处理catch
的顶级PDOException
块中,您可以将SHOW processlist的结果保存在日志文件中以供以后分析。但请确保此类日志条目的数量在每单位时间内受到限制,以免淹没您的日志文件。
请注意,对于拥有max_connections的用户的客户端连接,MySQL允许多于SUPER privileges的连接。
您可以使用此类用户收集进程列表信息。或者 - 如果是PDOException
- 您可能会在短时间内延迟应用程序并尝试再次连接,然后保存进程列表。
无限磁盘空间
无限磁盘空间不存在:由于简单的事实,所生产的HDD和SSD的数量是有限数量; - )
虽然您的提供商未设置限制,但存在技术限制 - 在您的情况下很可能不重要。
实际上,还有另一个限制:编写并运行一个分配越来越多磁盘空间的应用程序。在很短的时间内,您的提供商将拒绝您的合同......
答案 2 :(得分:1)
您的连接代码没有任何问题。
在共享主机上,“无限制”意味着其他用户不受资源使用限制。意味着他们可以吃掉整个游泳池,而你的消费量仍然适中。
正如评论中所说,不要使用此主机。