ThinkPHP 手动连接数据库实现断线重连

首先要手动连接数据库,需要知道ThinkPHP连接数据库的函数:

/**
     * 连接数据库方法
     * @access public
     */
    public function connect($config='',$linkNum=0,$autoConnection=false) {
        if ( !isset($this->linkID[$linkNum]) ) {
            if(empty($config))  $config =   $this->config;
            try{
                if(empty($config['dsn'])) {
                    $config['dsn']  =   $this->parseDsn($config);
                }
                if(version_compare(PHP_VERSION,'5.3.6','<=')){ 
                    // 禁用模拟预处理语句
                    $this->options[PDO::ATTR_EMULATE_PREPARES]  =   false;
                }
                $this->linkID[$linkNum] = new PDO( $config['dsn'], $config['username'], $config['password'],$this->options);
            }catch (\PDOException $e) {
                if($autoConnection){
                    trace($e->getMessage(),'','ERR');
                    return $this->connect($autoConnection,$linkNum);
                }elseif($config['debug']){
                    E($e->getMessage());
                }
            }
        }
        return $this->linkID[$linkNum];
    }


我们要做的就是导出这个函数


这里先看ThinkPHP的调用方法:

    /**
     * 初始化数据库连接
     * @access protected
     * @param boolean $master 主服务器
     * @return void
     */
    protected function initConnect($master=true) {
        if(!empty($this->config['deploy']))
            // 采用分布式数据库
            $this->_linkID = $this->multiConnect($master);
        else
            // 默认单数据库
            if ( !$this->_linkID ) $this->_linkID = $this->connect();
    }

这个函数主要是判断一下数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)。如果是0的话就是单一服务器,那就默认linkNum为0。直接调用connect获取PDO对象的上下文返回。但是这个函数是protected定义方式。我们外部是没办法直接引用的。所以你可以在它的上面定义一个函数newInitConnect来进行连接,这里更改protected为public。这样外部就能引用了。

引用方法:$this->db->newInitConnect();


PDOMysql.Lib.class版本的initConnect

    /**
     * 初始化数据库连接
     * @access protected
     * @param boolean $master 主服务器
     * @return void
     */
    protected function initConnect($master=true) {
        //读写分离数据库配置
        if ($this->config['deploy_type'] == 1){
            $this->_linkID = $this->multiConnect($master);
        }else{
            $this->_linkID = $this->singleConnect();
        }
    }
protected function singleConnect($master=false){
    if(!$master){
        if (!$this->connected){
            $this->traceCfg = $this->config;
            $this->traceCfg['link_num'] = 0;
            $this->_linkID              = $this->connect();
        }
    }
}

注意一下这个$this->config。当你连接过一次以后这里的config已经被置为NULL。所以你需要更改为:

 $this->config = $this->traceCfg;


通过这样的操作可以实现CLI断线重连。


ThinkPHP 手动连接数据库实现断线重连


本站如无特别说明即为原创,转而告知:(http://iwonmo.com/archives/1304.html)

标签: php, thinkphp, thinkphp数据库, PHP CLI 断线重连

添加新评论