Php CodeIgniter数据库连接未关闭

Php CodeIgniter数据库连接未关闭,php,database,codeigniter,database-connection,Php,Database,Codeigniter,Database Connection,我在CodeIgniter中建立了一个社交社区网站,现在流量相当大,托管公司开始抱怨,说数据库接收到了空连接以及未关闭的连接 我不完全确定什么是空查询,或者一个空查询最终将如何发出,有什么想法吗 我添加了额外的代码,在代码结束时强制关闭连接,但显然这不起作用 有没有人能就如何查找或开始调试这样的问题提供一些建议 谢谢 我的核心我的\u控制器的底部有以下内容 public function __destruct() { $this->db->close(); } 您是否尝试过

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

我不完全确定什么是空查询,或者一个空查询最终将如何发出,有什么想法吗

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

有没有人能就如何查找或开始调试这样的问题提供一些建议

谢谢

我的核心
我的\u控制器的底部有以下内容

public function __destruct() {
    $this->db->close();
}

您是否尝试过执行
$this->db->close()
查询完成后?

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


请参见

我认为您正在从Codeigniter连接数据库中获取初始配置的问题

在此页面,您可以看到配置数组中的每个值:

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

如果您像我说的那样将其设置为false,您的系统将继续完美工作,但是codeigniter将在需要使用数据库时关闭并打开连接

在这里,你可以在codeigniter论坛内找到一个对pconnect变量有问题的人,并将其发布,这可能会对你有所帮助!

不久前我也遇到过同样的问题,解决方案是多部分的(直到所有部分一起出现问题之前,问题的任何一部分都不会浮出水面)。PConnect应该关闭,除非您知道如何使用它(正如其他人所说)

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

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


编辑:我忘记了一件事——有时候PHP错误会破坏CI的析构函数操作(据我所知,它会自动关闭连接),所以你也可以检查你的错误日志。

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

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


我知道你说过没有启用持久连接,我就是这样调试我的问题的,听起来和你的问题很相似

我在一个CI站点上通过将驱动程序“mysql”更改为“mysqli”解决了相同的问题: Database.php:

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

3个答案,其中没有一个是问题的答案。你的主持人是否提到了什么是
null连接
?不幸的是,我没有主机关于null问题的详细信息:很多来自查询本身为“null”的站点的连接,你需要调试SQL查询。将它们全部记录下来,包括在执行“NULL”查询时的回溯。首先,我将集中精力消除“NULL”查询,使用一个MySQL数据库。我从来没有追根究底,主办公司也从来没有再抱怨过,所以我相信问题已经到了尽头。这不是他要问的。他说他已经在最后关闭了连接,但是这不起作用,所以他想用某种方法来调试这个问题。谢谢你的评论,但是pconnect变量已经设置为false。
$db['default']['dbdriver'] = "mysqli";