持久连接不适用于CodeIgniter中的mysqli驱动程序

bes*_*rld 5 php mysqli codeigniter

我在本地开发环境上有此数据库配置

$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;
Run Code Online (Sandbox Code Playgroud)

当我将其转移到生产服务器时,它不起作用,因此我尝试了很多事情,但是有一件事seemed to work是将dbdriver更改为mysqli而不是mysqli。但是我也不得不将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
Run Code Online (Sandbox Code Playgroud)

经过一些挖掘后,我发现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();
}
Run Code Online (Sandbox Code Playgroud)

仔细查看上面的db_connect()和db_pconnect()-假定错误。我删除了@作为返回值,然后得到了:

严重程度:警告

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

文件名:mysqli / mysqli_driver.php

行号:76

这是FAR更具解释性的错误

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

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

这是CodeIgniter开发团队的全部错过吗,还是我错过了什么?

Gho*_*ler 3

参考您的其他线程,我假设您指定使用持久连接似乎是正确的,但查看 CodeIgniter 的源代码我们可以得出不同的结论:MySQL 驱动程序实际上注意到此选项开始设置。而正如您正确分析的那样,MySQLi 驱动程序却没有。这也已在错误报告中指出并已得到修复。

正如你所看到的,整个 MySQLi 驱动程序类在开发分支中被重写

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

正如我在其他答案中所述,您的另一个选择是,您简要估计应用程序使用的连接,并max_connections根据您的实际需求调整限制大小。