克隆CodeIgniter的数据库对象

时间:2012-12-12 18:48:30

标签: php codeigniter

我正在为CodeIgniter(link to project)创建子查询库,它通过返回可以使用的数据库对象而不是普通的$this->db对象来工作。

最初,我每次都在制作新的数据库对象:

$this->CI =& get_instance();
$db = $this->CI->load->database('', true);

但我后来意识到(或者更确切地说有人向我指出)每次都会建立一个新的数据库连接!所以我决定尝试clone个对象,而不是制作新对象。

我将代码更新为(link to full code):

class Subquery{
    var $CI, $db;

    function __construct(){
        $this->CI =& get_instance();
        $this->db = $this->CI->db; // Default database connection
    }

    function start_subquery(){
        $newDatabase = clone $this->db;
        // some more code
        return $newDatabase;
    }
}

我对此进行了测试,似乎有效,但我不确定这是否能解决问题。使用clone建立新的数据库连接,还是在内部使用引用并且只保留一个连接?

1 个答案:

答案 0 :(得分:3)

首先,=&是不必要的,如果您不使用PHP 4(我假设get_instance返回一个对象)可能有害。

至于clone是否创建新连接..这取决于数据库实现。据我所知,PDO在克隆时不会创建额外的连接。如果要对此进行测试,请创建一个运行start_subquery的小脚本,然后休眠一段时间。连接到mysql并运行:

SHOW STATUS WHERE `variable_name` = 'Threads_connected'

如果它超过2(您运行查询的连接和脚本中的连接),则由于某种原因正在建立另一个连接。

至于是否你应该克隆数据库,我不知道你为什么要这样做,但我真的不知道这个类的用例,我也不太了解CI