持久连接不适用于 codeIgniter 中的 mysql 驱动程序
Posted
技术标签:
【中文标题】持久连接不适用于 codeIgniter 中的 mysql 驱动程序【英文标题】:Persistant connections not working with mysqli driver in codeIgniter 【发布时间】:2014-07-08 16:08:41 【问题描述】:我的本地开发环境中有这个数据库配置
$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;
当我将它转移到生产服务器时它不起作用,所以我尝试了很多东西,但seemed to work
的一件事是将 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() 的工作方式完全相同:
- 如果您查看 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 开发团队完全错过了还是我错过了什么?
【问题讨论】:
【参考方案1】:参考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
限制。
【讨论】:
它与新的 CodeIgniter 开发分支数据库驱动程序一起使用。谢谢! 不客气(并且很好地分析了您自己的问题)!以上是关于持久连接不适用于 codeIgniter 中的 mysql 驱动程序的主要内容,如果未能解决你的问题,请参考以下文章