持久连接不能与codeIgniter中的mysql驱动程序一起使用

I have this db-configuration on my local development environment

$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;

When I transfer to this to a production server it doesn't work so I've tried a lot of things, but one thing that seemed to work was to change the dbdriver to mysqli instead of mysql. But I also hade to put db_debug to FALSE (so it "worked" wouldn't be the correct statement)

I have read about this a lot, but I haven't found an answer to this anywhere. (I'm not satisfied with: "Change to debug = false and it would work")

I wanted to see what the actual problem was so I changed the local server to mysqli driver as well and then I got the error:

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

After some digging I see that db_connect() and db_pconnect() are working in the exact same manner:

  1. If you look in the system/database/drivers/mysqli/mysqli_driver.php - it seems like connect() and pconnect() are working exactly the same way because pconnect() is just calling connect() function.

so $db['default']['pconnect'] = TRUE; is totally useless when using mysqli driver.

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();
}

Taking a closer look at db_connect() and db_pconnect() above - erorrs are suppresed. I removed the @ for the return value and then got this:

Severity: Warning

Message: mysqli_connect(): (08004/1040): Too many connections

Filename: mysqli/mysqli_driver.php

Line Number: 76

which is a FAR more explainatory error

so my thought is that db_pconnect for mysqli driver should look something like this:

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

Is this a total miss from CodeIgniter development team or am I missing something?

1个回答



参考您的其他主题</ a >我假设你指定使用持久连接似乎是真的,但是看看CodeIgniter的源代码我们可以得出一个不同的结论: MySQL驱动程序实际上注意到此选项开始设置。 而MySQLi驱动程序</ a>,正如你正确分析的那样,没有。 这也在错误报告中进行了评论,并且已经修复。</ p>

如您所见整个MySQLi驱动程序类在开发分支中被重写。</ p>

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

你的另一个选择是,就像我在其他答案中所说的那样,你简要估计你的应用程序和 根据您的实际需要调整 max_connections </ code>限制。</ p>
</ div>

展开原文

原文

Referring to your other thread my assumption that you specified to use persistent connections seems to be true, but taking a look at the source code of CodeIgniter we can come to a different conclusion: The MySQL driver actually notices this option begin set. Whereas the MySQLi driver, as you correctly analyzed, does not. This has been also remarked in a bug report and already been fixed.

As you can see the whole MySQLi driver class was rewritten in the development branch.

Therefore you have used persistent connections until now, but (unwillingly) stopped using them when switching to MySQLi, because this fix has not been released... you could try to use the development branch, if this is an option. (Or only replace this single file ... should work too.)

Your other option is, like I stated in my other answer, that you briefly estimate the used connections by your application and resize the max_connections limit according to your real needs.

douping3891
douping3891 欢迎你(并分析你自己的问题做得很好)!
6 年多之前 回复
dpy33121
dpy33121 它适用于新的CodeIgniter dev分支数据库驱动程序。 谢谢!
6 年多之前 回复
立即提问
相关内容推荐