CodeIgniter数据库连接未关闭

时间:2011-08-24 09:21:15

标签: php database codeigniter database-connection

我已经在CodeIgniter中建立了一个社交社区网站,该网站现在得到了相当多的流量,托管公司已开始抱怨并说数据库正在接收空连接以及未关闭的连接。

我不完全确定什么是空查询或者最终会发布什么想法?

我添加了额外的代码,以便在代码结束时强制关闭连接,但显然这不起作用。

任何人都可以提供关于在哪里查看或开始调试此类问题的任何建议吗?

由于

我的核心MY_Controller

底部有以下内容
public function __destruct() {
    $this->db->close();
}

6 个答案:

答案 0 :(得分:26)

我认为您在使用Codeigniter连接数据库的初始配置时遇到了问题。

在此页面,您可以看到配置数组中的每个值:
https://www.codeigniter.com/user_guide/database/configuration.html

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "database_name";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = FALSE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";
$db['default']['swap_pre'] = "";
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

这是一个基本的数组配置数据库,尝试将pconnect的变量设置为FALSE,当它打开时,系统不会关闭任何连接,并且它会随时对新闻查询保持打开状态。

如果你像我说的那样将它设置为假,你的系统将继续正常工作,但是当他需要使用数据库时,codeigniter将关闭并打开连接。

在这里,您可以在codeigniter论坛内找到并发布一个有pconnect变量问题的人,可以帮到您! http://codeigniter.com/forums/viewthread/177573/#842016

答案 1 :(得分:6)

Codeigniter应自动关闭数据库连接,但您可以使用$this->db->close();

隐式调用它

请参阅http://codeigniter.com/user_guide/database/connecting.html

答案 2 :(得分:2)

您是否在查询完成后尝试$this->db->close();

答案 3 :(得分:1)

我过去遇到类似CodeIgniter的问题,它们是由MySQL中的持久连接引起的,默认情况下在CodeIgniter中启用。我在MySQL中使用SHOW PROCESSLIST查询来查看打开的连接,它们当前运行的查询,连接打开的时间(以秒为单位)等。如果连接空闲,则返回Command字段包含SleepInfo字段(查询)将是NULL,这可能是您的主机所指的内容。这是一个从这样的问题开始的好地方。

我想要注意的另一件事是PHP的细微差别,mysql_close从控制器的__destruct方法调用here将不会关闭持久的MySQL连接。 PHP将在脚本执行结束时关闭非持久连接,因此通常不需要调用它。

我意识到你曾说过没有启用持久连接,这就是我调试问题的方式,听起来与你的问题非常相似。

答案 4 :(得分:0)

我有一段时间没有同样的问题,解决方案是多部分的(问题的任何一部分都没有浮出水面,直到所有部分一起出现问题)。 PConnect应该关闭,除非你知道如何使用它(正如其他人所说)。

要考虑的另一件事是您的Web服务器是否具有线程(例如Apache的工作模式 - 最常见的Web服务器)。如果您获得了大量流量,并且线程未快速关闭,则可能会遇到某些并发Web服务器/数据库服务器连接限制或耗尽内存/处理器资源。这可能会导致某些数据库连接挂起。

所以,我会检查问题的其他迹象,而不是假设数据库是源。它很可能是一种症状。您是否有关于空连接的任何信息(比如哪个数据库用户生成它们)?这可以帮助你追溯......

编辑:我忘记了一件事 - 有时PHP错误会搞砸CI的破坏操作(根据我的理解自动关闭连接),因此您也可以检查错误日志。

答案 5 :(得分:0)

我通过更改驱动程序' mysql'在一个CI网站上解决了同样的问题。到了' mysqli'在: database.php中:

$db['default']['dbdriver'] = "mysqli";