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

时间:2014-05-20 11:52:33

标签: php codeigniter mysqli

我在本地开发环境中有这个db-configuration

$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()的工作方式完全相同:

  1. 如果您查看system / database / drivers / mysqli / mysqli_driver.php - 似乎connect()pconnect()的工作方式完全相同,因为pconnect()只是在调用{ {1}}功能。
  2. 因此使用mysqli驱动程序时connect()完全没用。

    $db['default']['pconnect'] = TRUE;

    仔细研究上面的db_connect()和db_pconnect() - 这些都是有争议的。我删除了@的返回值,然后得到了这个:

    严重性:警告

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

    文件名:mysqli / mysqli_driver.php

    行号:76

    这是FAR更多的解释性错误

    所以我的想法是mysqli驱动的db_pconnect应该是这样的:

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

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

1 个答案:

答案 0 :(得分:3)

参考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限制。