【问题标题】:CodeIgniter database connections not being closedCodeIgniter 数据库连接未关闭
【发布时间】:2011-08-24 09:21:15
【问题描述】:

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

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

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

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

谢谢

我的核心底部有以下内容MY_Controller

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

【问题讨论】:

  • 3 个答案,其中没有一个实际上是问题的答案。
  • 您的主机是否提到了null connection 是什么?
  • 不幸的是,我没有关于空问题的详细信息,来自主机:来自查询本身为“空”的站点的大量连接
  • 你需要调试你的 SQL 查询。将它们全部记录下来,包括。回溯,以防您执行“NULL”查询。我首先会专注于消除“NULL”查询。
  • 正在使用单个 MySQL 数据库。我从来没有深究此事,托管公司也没有再提出任何投诉,所以我相信问题已经解决了。

标签: php database codeigniter database-connection


【解决方案1】:

我认为您在使用 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

【讨论】:

  • 感谢您的评论,但 pconnect 变量已设置为 false。
【解决方案2】:

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

http://codeigniter.com/user_guide/database/connecting.html

【讨论】:

  • 这不是他要问的。他说他已经在最后关闭了连接,但这不起作用,所以他想要一些方法来调试问题。
【解决方案3】:

你有没有试过在查询后做$this->db->close();

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

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

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

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 2011-12-29
          • 2018-06-23
          • 2013-10-13
          • 2014-06-28
          • 1970-01-01
          • 2011-10-19
          • 2013-10-16
          相关资源
          最近更新 更多