我的本地开发环境中有这个数据库配置
$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()
and pconnect()
工作方式完全相同,因为pconnect()
正在打电话connect()
功能。
so $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_connect() - 错误被抑制。我删除了返回值的@,然后得到了这个:
严重性:警告
消息: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 开发团队的完全失误还是我错过了什么?