昨天一切正常。我将 PHP 应用程序的链接发送给客户。几个小时后,我查看了该页面并在源代码中看到以下错误:
SQLSTATE[00000] [1040] Too many connections
我还记录了错误,只看到上面的消息。
在 PHP 应用程序中,有许多请求,但只针对一个特定的表(没有连接 ...)。我还使用自己的类进行数据库连接。在其中我有一个手柄,如果之前没有设置,则设置它。
if($this->_handle == null){
$this->Connect();
}
try{
// make query
}
catch(PDOException $e){
echo "An error occured: {$e->getMessage()}";
file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
}
所以每个请求都不应该有一个新的连接。但我从不关闭连接(不知道我应该在哪里关闭它)。
- 是为每个用户建立新连接还是为多个用户使用相同的连接?
- 如果连接可用,我如何签入代码并向用户显示相应的消息而不是显示恶意页面?
- 我的代码是否有问题,使用了太多连接?
- 如果成功连接,我如何记录?
这是我的连接功能:
public function Connect(){
try{
$this->_handle = new PDO("mysql:host={$this->dbhost};dbname={$this->dbname}", $this->dbuser, $this->dbpasswd);
$this->_handle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e){
echo "An error occured: {$e->getMessage()}";
file_put_contents('PDOErrors.txt', $e->getMessage() . chr(10) . chr(13), FILE_APPEND);
}
}
比我在此错误后尝试搜索互联网。这是我发现的:
MySQL 服务器 5.0.77 ->手动
PHP 5.2.9 锁定 phpinfo()
show variables like 'max_connections';
给我1000!
如果我使用SHOW STATUS;
,我会看到以下内容:
Aborted_clients 16
Aborted_connects 15248
Connections 1694699
Max_used_connections 1001
Queries 266398903
Table_locks_immediate 36136077
Table_locks_waited 40387
Threads_connected 2
Threads_created 1694698
Threads_running 2
Uptime 2143256
- 我认为我一天内没有达到这个数量的查询,所以这是共享主机吗?
- 对于连接过多的问题,我能做些什么?
目前一切正常,但如果系统上线并且更多用户将使用它,我不希望出现这个问题。