thinkphp3.2.3框架动态切换多数据库的方法分析
程序员文章站
2023-12-26 15:10:21
本文实例讲述了thinkphp3.2.3框架动态切换多数据库的方法。分享给大家供大家参考,具体如下:版本说明:thinkphp3.2.3新增自定义行为类文件位置:application/common/...
本文实例讲述了thinkphp3.2.3框架动态切换多数据库的方法。分享给大家供大家参考,具体如下:
版本说明:
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; }