美文网首页
thinkphp3.2.3动态切换多数据库

thinkphp3.2.3动态切换多数据库

作者: liangxifeng833 | 来源:发表于2016-08-13 19:20 被阅读1616次

    版本说明:

    • thinkphp3.2.3

    新增自定义行为类

    • 文件位置:Application/Common/Behaviors/SwitchDbBehavior.class.php
    • 文件内容:
    namespace Common\Behaviors;
    class SwitchDbBehavior 
    {
        //私有库id,如何连接公有库则设置为share字符串
        private $_privateId = '';
    
        /*
         * 行为扩展的执行入口必须是run
         * $param 为引用传值,所以实参必须是变量
         */ 
        public function run(&$params)
        {
            //获取私有库id
            $this->_privateId = empty($params) && session('?privateId') ? (int)session('privateId') : trim($params);
            //echo 'curent database is '.$this->_privateId;
            //默认连接公有库
            if(empty($this->_privateId)) $this->_privateId = 'share';
            $this->_checkDb();
    
            //连接公有库
            if('share' == trim($this->_privateId))
            {
                $share = $this->_connectShare();
            }else
            //连接私有库
            {
                $share = $this->_connectPrivate($this->_privateId);
            }
            //循环修改数据库配置信息
            foreach($share as $dbKey=>$dbVal)
            {
                C($dbKey,$dbVal);
            }
        }
    
        /*
        * 判断数据库是否存在
        */
        private function _checkDb()
        {
            //C('PRIVATEIDS') 在配置文件Appliation/Common/Conf/dbname.php中定义
            if(!in_array($this->_privateId,C('PRIVATEIDS')))
            {
                exit(__CLASS__.'->'.__FUNCTION__.': dbName error!');
            }
        }
    
        /*
        * 返回连接私有库配置
        */
        private function _connectPrivate($privateId)
        {
            return array(
                'DB_TYPE'   => 'mysql', // 数据库类型
                'DB_HOST'   => DB_WECHAT_HOST, // 服务器地址
                'DB_NAME'   => DB_WECHAT_NAME.(int)$privateId, // 数据库名
                'DB_USER'   => DB_WECHAT_USER, // 用户名
                'DB_PWD'    => DB_WECHAT_PASS, // 密码
                'DB_PORT'   => DB_WECHAT_PORT, // 端口
                'DB_PARAMS' =>  array(), // 数据库连接参数
                'DB_PREFIX' => '', // 数据库表前缀 
                'DB_CHARSET'=> 'utf8', // 字符集
                'DB_DEBUG'  =>  DB_WECHAT_DEBUG, // 数据库调试模式 开启后可以记录SQL日志
            );
        }
        /*
        * 返回连接公有库配置
        */
        private function _connectShare()
        {
            return array(
                'DB_TYPE'   => 'mysql', // 数据库类型
                'DB_HOST'   => DB_WECHAT_HOST, // 服务器地址
                'DB_NAME'   => DB_WECHAT_SHARE_NAME, // 数据库名
                'DB_USER'   => DB_WECHAT_USER, // 用户名
                'DB_PWD'    => DB_WECHAT_PASS, // 密码
                'DB_PORT'   => DB_WECHAT_PORT, // 端口
                'DB_PARAMS' =>  array(), // 数据库连接参数
                'DB_PREFIX' => '', // 数据库表前缀 
                'DB_CHARSET'=> 'utf8', // 字符集
                'DB_DEBUG'  =>  DB_WECHAT_DEBUG, // 数据库调试模式 开启后可以记录SQL日志
            );
        }
    }
    
    • 以上文件中用到的常量在我们的配置文件Application/Common/Conf/constant.php中. 内容如下:
    /*数据库配置*/
    define('DB_WECHAT_HOST','127.0.0.1');               //主机host
    define('DB_WECHAT_USER','common');                  //用户名
    define('DB_WECHAT_PASS','common');                  //密码
    define('DB_WECHAT_NAME','wechat_');                 //私有库前缀
    define('DB_WECHAT_SHARE_NAME','wechat_share');      //共有库名
    define('DB_WECHAT_PORT','3306');                    //端口
    define('DB_WECHAT_DEBUG',TRUE);                   //数据库调试模式 开启后可以记录SQL日志
    
    • 图中代码验证数据库存在不存在的C('PRIVATEIDS')在文件Application/Common/Conf/dbname.php中配置内容如下:
    <?php                                                                                                                                                 
    /*
     * 本配置文件主要存储数据库后缀名,
     * 前缀为wechat_,
     * 在Application/Common/Behaviors/TestBehavior.class.php中验证
     * 注意:在新增数据库的时候,注意修改该文件
     *
     * @author: liangxifeng
     * @date: 2016-08-13
     */
    return array(
            'PRIVATEIDS'=>array('share',1,2,3,4)
    );
    
    • constant.php和dbname.php则是在配置文件Application/Common/Conf/config.php中使用扩展配置选项配置加载;
    'LOAD_EXT_CONFIG' => 'constants,systemConfig,dbname',//加载常量配置
    
    • 在使用自定义行为类的时候要在Application/Common/Conf/中新增tags.php
      内容如下:
    /*
     * 扩展行为类配置文件
     * @author:liangxifeng
     * @date:2016-08-13
     */
    return array(
            //应用开始标签位添加切换数据库行为
            'action_begin'=>array('Common\\Behaviors\\SwitchDbBehavior'), 
    );
    

    使用方法

    在注册session后或手动加载使用,比如在控制器中:

        public function index()
        {   
            //注册session切换数据库
            session('privateId',2);                                                                                                                       
    
            //手动切换数据库为私有库
            tag('action_begin',$params='share');
            $wechat = D('Wechat');
            
            //查询数据库
            $res = $wechat->where('wechat_id=1')->find();
            echo "<pre>";
            var_dump($res);
            exit;
       }
    

    相关文章

      网友评论

          本文标题:thinkphp3.2.3动态切换多数据库

          本文链接:https://www.haomeiwen.com/subject/qbfysttx.html