CodeIgniter数据库连接未关闭

24
我在CodeIgniter中建立了一个社交网络网站,现在访问量相当大,托管公司开始抱怨说数据库接收到的连接为空或未被关闭。
我不确定null查询是什么,或者为什么会发出这样的查询,你有什么想法吗?
我添加了额外的代码,在代码结束时强制关闭连接,但显然这并没有起作用。
有人可以提供任何建议,以解决这个问题或开始调试吗?
谢谢
我在我的核心MY_Controller底部添加了以下内容。
public function __destruct() {
    $this->db->close();
}

5
三个回答中没有一个是实际回答这个问题。 - laurent
你的主机提供商是否提到过“空连接”是什么? - hakre
很遗憾,我没有关于空值问题的详细信息,来自主机的消息是:有很多连接来自查询本身为“NULL”的站点。 - ArthurGuy
你是否正在使用多个数据库连接? - Radheshyam Nayak
1
只使用了一个MySQL数据库。我从未找到问题的根源,而托管公司也没有再提出任何投诉,因此我认为问题出在他们那里。 - ArthurGuy
显示剩余4条评论
6个回答

28

我认为你在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。当它被打开时,系统不会关闭任何连接,并且它保持打开状态以进行任何时间的新查询。

如果你按照我说的将其设置为false,你的系统将继续完美地工作,但是codeigniter会在需要使用数据库时关闭和打开连接。

在这里,你可以在codeigniter论坛中查找并发布与pconnect变量有问题的人的帖子,可能对你有所帮助! http://codeigniter.com/forums/viewthread/177573/#842016


5
感谢您的评论,但是pconnect变量已经设置为false了。 - ArthurGuy

6

他想要找到一种调试此问题的方法。他说已经在结尾处关闭了连接,但仍然存在问题。 - laurent

2

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


1
我曾经在使用CodeIgniter时遇到类似的问题,这是由于CodeIgniter默认启用了MySQL中的持久连接。我在MySQL中使用“SHOW PROCESSLIST”查询来查看已打开的连接,它们当前运行的查询,连接打开的时间(以秒为单位)等信息。如果连接处于空闲状态,则返回的“Command”字段将包含“Sleep”,而“Info”字段(查询)将为“NULL”,这可能是您的主机指的内容。这是解决此类问题的好方法。
另一个值得注意的细节是PHP中的“mysql_close”函数不会关闭持久的MySQL连接。该函数可以从控制器的“__destruct”方法中调用here,但不会关闭持久连接。通常情况下,PHP会在脚本执行结束时自动关闭非持久连接,因此通常无需调用该函数。
我知道你说没有启用持久连接,但这就是我解决类似问题时的方法。

0
我在一个CI站点上通过将驱动器“mysql”更改为“mysqli”来解决了相同的问题,具体操作如下:
在Database.php文件中进行修改。
$db['default']['dbdriver'] = "mysqli";

0

我之前也遇到过同样的问题,解决方案是多方面的(直到所有问题一起出现才能发现单个问题)。除非你知道如何使用PConnect(正如其他人所说),否则应该关闭它。

另一件要考虑的事情是你的Web服务器是否是线程化的(例如Apache的工作模式-大多数常见的Web服务器都是这样)。如果你的流量很大,而且你的线程没有快速关闭,你可能会遇到一些并发的Web服务器/数据库服务器连接限制,或者耗尽内存/处理器资源。这可能会导致一些数据库连接挂起。

因此,我建议检查其他问题的迹象,不要假设数据库是问题的根源。它很可能只是一个症状。你有关于空连接的任何信息吗(比如哪个数据库用户生成了它们)?那可能会帮助你追溯回去...

编辑:我忘记的一件事-有时PHP错误可能会破坏CI的析构操作(从我的理解来看,这些操作会自动关闭连接),所以你也可以检查一下错误日志。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接