thinkphp3.2.3动态切换多数据库

时间:2019-01-10
本文章向大家介绍thinkphp3.2.3动态切换多数据库,主要包括thinkphp3.2.3动态切换多数据库使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

版本说明:

  • thinkphp3.2.3

新增自定义行为类

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

    
     
    1. namespace Common\Behaviors;

    2. class SwitchDbBehavior

    3. {

    4. //私有库id,如何连接公有库则设置为share字符串

    5. private $_privateId = '';

    6.  
    7. /*

    8. * 行为扩展的执行入口必须是run

    9. * $param 为引用传值,所以实参必须是变量

    10. */

    11. public function run(&$params)

    12. {

    13. //获取私有库id

    14. $this->_privateId = empty($params) && session('?privateId') ? (int)session('privateId') : trim($params);

    15. //echo 'curent database is '.$this->_privateId;

    16. //默认连接公有库

    17. if(empty($this->_privateId)) $this->_privateId = 'share';

    18. $this->_checkDb();

    19.  
    20. //连接公有库

    21. if('share' == trim($this->_privateId))

    22. {

    23. $share = $this->_connectShare();

    24. }else

    25. //连接私有库

    26. {

    27. $share = $this->_connectPrivate($this->_privateId);

    28. }

    29. //循环修改数据库配置信息

    30. foreach($share as $dbKey=>$dbVal)

    31. {

    32. C($dbKey,$dbVal);

    33. }

    34. }

    35.  
    36. /*

    37. * 判断数据库是否存在

    38. */

    39. private function _checkDb()

    40. {

    41. //C('PRIVATEIDS') 在配置文件Appliation/Common/Conf/dbname.php中定义

    42. if(!in_array($this->_privateId,C('PRIVATEIDS')))

    43. {

    44. exit(__CLASS__.'->'.__FUNCTION__.': dbName error!');

    45. }

    46. }

    47.  
    48. /*

    49. * 返回连接私有库配置

    50. */

    51. private function _connectPrivate($privateId)

    52. {

    53. return array(

    54. 'DB_TYPE' => 'mysql', // 数据库类型

    55. 'DB_HOST' => DB_WECHAT_HOST, // 服务器地址

    56. 'DB_NAME' => DB_WECHAT_NAME.(int)$privateId, // 数据库名

    57. 'DB_USER' => DB_WECHAT_USER, // 用户名

    58. 'DB_PWD' => DB_WECHAT_PASS, // 密码

    59. 'DB_PORT' => DB_WECHAT_PORT, // 端口

    60. 'DB_PARAMS' => array(), // 数据库连接参数

    61. 'DB_PREFIX' => '', // 数据库表前缀

    62. 'DB_CHARSET'=> 'utf8', // 字符集

    63. 'DB_DEBUG' => DB_WECHAT_DEBUG, // 数据库调试模式 开启后可以记录SQL日志

    64. );

    65. }

    66. /*

    67. * 返回连接公有库配置

    68. */

    69. private function _connectShare()

    70. {

    71. return array(

    72. 'DB_TYPE' => 'mysql', // 数据库类型

    73. 'DB_HOST' => DB_WECHAT_HOST, // 服务器地址

    74. 'DB_NAME' => DB_WECHAT_SHARE_NAME, // 数据库名

    75. 'DB_USER' => DB_WECHAT_USER, // 用户名

    76. 'DB_PWD' => DB_WECHAT_PASS, // 密码

    77. 'DB_PORT' => DB_WECHAT_PORT, // 端口

    78. 'DB_PARAMS' => array(), // 数据库连接参数

    79. 'DB_PREFIX' => '', // 数据库表前缀

    80. 'DB_CHARSET'=> 'utf8', // 字符集

    81. 'DB_DEBUG' => DB_WECHAT_DEBUG, // 数据库调试模式 开启后可以记录SQL日志

    82. );

    83. }

    84. }

  • 以上文件中用到的常量在我们的配置文件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' => 'constant,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. {

  3. //注册session切换数据库

  4. session('privateId',2);

  5.  
  6. //手动切换数据库为私有库

  7. tag('action_begin',$params='share');

  8. $wechat = D('Wechat');

  9.  
  10. //查询数据库

  11. $res = $wechat->where('wechat_id=1')->find();

  12. echo "<pre>";

  13. var_dump($res);

  14. exit;