当前位置:首页 > CMS教程 > Thinkphp > 列表

thinkphp3.2.3框架动态切换多数据库的方法分析

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-07 10:30:34 浏览: 评论:0 

这篇文章主要介绍了thinkphp3.2.3框架动态切换多数据库的方法,结合实例形式分析了thinkPHP3.2.3框架多数据库切换的配置、使用相关操作技巧与注意事项,需要的朋友可以参考下。

本文实例讲述了thinkphp3.2.3框架动态切换多数据库的方法,分享给大家供大家参考,具体如下:

版本说明:

thinkphp3.2.3

新增自定义行为类

文件位置:Application/Common/Behaviors/SwitchDbBehavior.class.php

文件内容:

  1. namespace Common\Behaviors; 
  2. class SwitchDbBehavior 
  3.  //私有库id,如何连接公有库则设置为share字符串 
  4.  private $_privateId = ''
  5.  /* 
  6.   * 行为扩展的执行入口必须是run 
  7.   * $param 为引用传值,所以实参必须是变量 
  8.   */ 
  9.  public function run(&$params
  10.  { 
  11.    //获取私有库id 
  12.    $this->_privateId = emptyempty($params) && session('?privateId') ? (int)session('privateId') : trim($params); 
  13.    //echo 'curent database is '.$this->_privateId; 
  14.    //默认连接公有库 
  15.    if(emptyempty($this->_privateId)) $this->_privateId = 'share'
  16.    $this->_checkDb(); 
  17.    //连接公有库 
  18.    if('share' == trim($this->_privateId)) 
  19.    { 
  20.      $share = $this->_connectShare(); 
  21.    }else 
  22.    //连接私有库 
  23.    { 
  24.      $share = $this->_connectPrivate($this->_privateId); 
  25.    } 
  26.    //循环修改数据库配置信息 
  27.    foreach($share as $dbKey=>$dbVal
  28.    { 
  29.      C($dbKey,$dbVal); 
  30.    } 
  31.  } 
  32.  /* 
  33.  * 判断数据库是否存在 
  34.  */ 
  35.  private function _checkDb() 
  36.  { 
  37.    //C('PRIVATEIDS') 在配置文件Appliation/Common/Conf/dbname.php中定义 
  38.    if(!in_array($this->_privateId,C('PRIVATEIDS'))) 
  39.    { 
  40.      exit(__CLASS__.'->'.__FUNCTION__.': dbName error!'); 
  41.    } 
  42.  } 
  43.  /* 
  44.  * 返回连接私有库配置 
  45.  */ 
  46.  private function _connectPrivate($privateId
  47.  { 
  48.    return array
  49.      'DB_TYPE'  => 'mysql'// 数据库类型 
  50.      'DB_HOST'  => DB_WECHAT_HOST, // 服务器地址 
  51.      'DB_NAME'  => DB_WECHAT_NAME.(int)$privateId// 数据库名 
  52.      'DB_USER'  => DB_WECHAT_USER, // 用户名 
  53.      'DB_PWD'  => DB_WECHAT_PASS, // 密码 
  54.      'DB_PORT'  => DB_WECHAT_PORT, // 端口 
  55.      'DB_PARAMS' => array(), // 数据库连接参数 
  56.      'DB_PREFIX' => ''// 数据库表前缀 
  57.      'DB_CHARSET'=> 'utf8'// 字符集 
  58.      'DB_DEBUG' => DB_WECHAT_DEBUG, // 数据库调试模式 开启后可以记录SQL日志 
  59.    ); 
  60.  } 
  61.  /* 
  62.  * 返回连接公有库配置 
  63.  */ 
  64.  private function _connectShare() 
  65.  { 
  66.    return array
  67.      'DB_TYPE'  => 'mysql'// 数据库类型 
  68.      'DB_HOST'  => DB_WECHAT_HOST, // 服务器地址 
  69.      'DB_NAME'  => DB_WECHAT_SHARE_NAME, // 数据库名 
  70.      'DB_USER'  => DB_WECHAT_USER, // 用户名 
  71.      'DB_PWD'  => DB_WECHAT_PASS, // 密码 
  72.      'DB_PORT'  => DB_WECHAT_PORT, // 端口 
  73.      'DB_PARAMS' => array(), // 数据库连接参数 
  74.      'DB_PREFIX' => ''// 数据库表前缀 
  75.      'DB_CHARSET'=> 'utf8'// 字符集 
  76.      'DB_DEBUG' => DB_WECHAT_DEBUG, // 数据库调试模式 开启后可以记录SQL日志 
  77.    ); 
  78.  } 

以上文件中用到的常量在我们的配置文件Application/Common/Conf/constant.php中.内容如下:

  1. /*数据库配置*/ 
  2. define('DB_WECHAT_HOST','127.0.0.1');        //主机host 
  3. define('DB_WECHAT_USER','common');         //用户名 
  4. define('DB_WECHAT_PASS','common');         //密码 
  5. define('DB_WECHAT_NAME','wechat_');         //私有库前缀 
  6. define('DB_WECHAT_SHARE_NAME','wechat_share');   //共有库名 
  7. define('DB_WECHAT_PORT','3306');          //端口 
  8. define('DB_WECHAT_DEBUG',TRUE);          //数据库调试模式 开启后可以记录SQL日志 

图中代码验证数据库存在不存在的C('PRIVATEIDS')在文件Application/Common/Conf/dbname.php中配置内容如下:

  1. <?php 
  2. /* 
  3. * 本配置文件主要存储数据库后缀名, 
  4. * 前缀为wechat_, 
  5. * 在Application/Common/Behaviors/TestBehavior.class.php中验证 
  6. * 注意:在新增数据库的时候,注意修改该文件 
  7. * 
  8. * @author: liangxifeng 
  9. * @date: 2016-08-13 
  10. */ 
  11. return array
  12.    'PRIVATEIDS'=>array('share',1,2,3,4) 
  13. ); 

constant.php和dbname.php则是在配置文件Application/Common/Conf/config.php中使用扩展配置选项配置加载;

'LOAD_EXT_CONFIG' => 'constants,systemConfig,dbname',//加载常量配置

在使用自定义行为类的时候要在Application/Common/Conf/中新增tags.php

内容如下:

  1. /* 
  2. * 扩展行为类配置文件 
  3. * @author:liangxifeng 
  4. * @date:2016-08-13 
  5. */ 
  6. return array
  7.    //应用开始标签位添加切换数据库行为 
  8.    'action_begin'=>array('Common\\Behaviors\\SwitchDbBehavior'), 
  9. ); 

行为类介绍请点击

扩展行为类详细了解请点击

使用方法

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

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

Tags: thinkphp3.2.3动态切换

分享到: