php - 持久连接不适用于 codeIgniter 中的 mysql 驱动程序

标签 php codeigniter mysqli

我在我的本地开发环境中有这个数据库配置

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = ''; //Actual username is put inside these quotes
$db['default']['password'] = '';
$db['default']['database'] = ''; //Actual name of database is put inside quotes
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = APPPATH .'cache';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

当我将其转移到生产服务器时,它不起作用,所以我尝试了很多方法,但似乎起作用的一件事是将 dbdriver 更改为 mysqli 而不是 mysql。但我也必须将 db_debug 设置为 FALSE(因此它“有效”不是正确的陈述)

我已经阅读了很多关于此的内容,但我还没有在任何地方找到答案。 (我不满意:“更改为 debug = false 就可以了”)

我想看看实际问题是什么,所以我也将本地服务器更改为 mysqli 驱动程序,然后我得到了错误:

A Database Error Occurred

Unable to connect to your database server using the provided settings.

Filename: C:\Program Files\wamp\www\mellomgarden2\system\database\DB_driver.php

Line Number: 124

经过一些挖掘,我发现 db_connect() 和 db_pconnect() 以完全相同的方式工作:

  1. 如果您查看 system/database/drivers/mysqli/mysqli_driver.php - 似乎 connect()pconnect() 的工作方式完全相同因为 pconnect() 只是调用 connect() 函数。

所以 $db['default']['pconnect'] = TRUE; 在使用 mysqli 驱动时完全没用。

function db_connect()
{
    if ($this->port != '')
    {
        return @mysqli_connect($this->hostname, $this->username, $this->password, $this->database, $this->port);
    }
    else
    {
        return @mysqli_connect($this->hostname, $this->username, $this->password, $this->database);
    }

}
// --------------------------------------------------------------------

/**
 * Persistent database connection
 *
 * @access  private called by the base class
 * @return  resource
 */
function db_pconnect()
{
    return $this->db_connect();
}

仔细查看上面的 db_connect() 和 db_pconnect() - 抑制了错误。我删除了返回值的 @ 然后得到了这个:

严重性:警告

消息:mysqli_connect():(08004/1040):连接过多

文件名:mysqli/mysqli_driver.php

行号:76

这是一个更具解释性的错误

所以我的想法是 mysqli 驱动程序的 db_pconnect 应该看起来像这样:

function db_pconnect()
    {       
                 $this->hostname = 'p:' . ltrim($this->hostname, 'p:');                                  
                 return $this->db_connect();
    }

这是 CodeIgniter 开发团队完全遗漏的还是我遗漏了什么?

最佳答案

引用your other thread我假设您指定使用持久连接似乎是正确的,但看看 CodeIgniter 的源代码我们可以得出不同的结论:The MySQL driver实际上注意到这个选项开始设置。 Whereas the MySQLi driver ,正如您正确分析的那样,没有。这也已在 bug report 中注明。并且已经修复。

如你所见the whole MySQLi driver class was rewritten in the development branch .

因此,直到现在您一直在使用持久连接,但是在切换到 MySQLi 时(不情愿地)停止使用它们,因为此修复程序尚未发布……如果这是一个选项,您可以尝试使用开发分支。 (或者只替换这个单个文件......应该也可以。)

你的另一个选择是,就像我在我的另一个答案中所说的那样,你可以简单地估计你的应用程序使用的连接并根据你的实际需要调整 max_connections 限制。

关于php - 持久连接不适用于 codeIgniter 中的 mysql 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23759081/

相关文章:

javascript - 如何在多个动态创建的输入上使用 Bootstrap Datetimepicker

php - 在 mysqli 准备好的语句中使用数组 : `WHERE .. IN(..)` query

php - WordPress:使用 $wpdb->get_results 而不是 mysqli_query 会导致空变量

php - 从 mysql 检索以填充表单时遇到问题

php - 如何在smarty中找到foreach循环的最后一个索引

php - 禁用日期时间选择器中的时间选择器

php - 添加样式回显

php - CodeIgniter 中的 301 重定向有 ?问题

php - 通过graph api获取所有 friend 的生日信息的最简单方法?

php - 我可以使用相同的 SSL 证书来保护 Web 服务器和 mongo 服务器吗