设为首页收藏本站

LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区!

 找回密码
 注册

QQ登录

只需一步,快速开始

#公告#抱歉,网站将关闭,不再开放。由于PC时代已远逝 。在这个后移动互联网时代,我们继续携手前行,保持对技术的热情。共同构建linuxtone知识星球欢迎加入,一起讨论技术、招聘人才、分享资源。请新老linuxtone人 扫码移步到 知识星球:linuxtone

学习是一种信仰!分享是一种快乐!能力= 心态 * 沟通 * 知识 (你的每一天需要正能量!)

 网站的发展需要你贡献一份力量!希望你能每天坚持看贴1小时,并回答网友的问题!祝你在浏览论坛的过程中取得进步!谢谢!linuxtone加油!大家加油! 友情提示: 你今天学习了吗?你今天进步了吗?少一点抱怨!多一点进步!Life is short ! Why not linuxtone ?  

网站的发展、感谢每位坛友的努力!

查看: 6381|回复: 5

[php] php连接MySQL的类,支持读写分离 [复制链接]

LT管理团队

想飞的鸟

Rank: 9Rank: 9Rank: 9

签到
223
注册时间
2008-6-20
最后登录
2015-7-7
在线时间
594 小时
阅读权限
200
积分
23002
帖子
512
主题
83
精华
3
UID
95
发表于 2011-1-7 15:55:33 |显示全部楼层
  1. <?php
  2. /**
  3. * MySQL读写分离类的实现
  4. * $db_config = array(
  5. *          'master' => array('host'=>'localhost:3306','user'=>'admin','passwd'=>'123456','db'=>'stat'),
  6. *          'slave'  => array(
  7. *                           array('host'=>'localhost:3307','user'=>'admin','passwd'=>'123456','db'=>'stat'),
  8. *                           array('host'=>'localhost:3308','user'=>'admin','passwd'=>'123456','db'=>'stat')
  9. *                      )
  10. *  );
  11. *  
  12. *  注释:如果slave有多个时随机连接其中的一个
  13. */
  14. /*
  15. $db_config = array(
  16.     'master' => array('host'=>'localhost:3306','user'=>'admin','passwd'=>'123456','db'=>'stat'),
  17.     'slave'  => array(
  18.                     array('host'=>'localhost:3307','user'=>'admin','passwd'=>'123456','db'=>'stat'),
  19.                     array('host'=>'localhost:3308','user'=>'admin','passwd'=>'123456','db'=>'stat')
  20.                 )
  21. );



  22. $db = MySQL::getInstance('','r-w');

  23. $sql = "select * from admin";

  24. $rs = $db->query($sql);
  25. while ($row = $db->fetch($rs)){
  26.     echo "uid:".$row['uid']."   ".$row['userName']."<br />";
  27. }

  28. echo "<hr />";
  29. */


  30. class MySQL
  31. {
  32.    
  33.     private static $_instance = null;//数据库连接实例
  34.     private static $_master = null;//主数据库连接实例
  35.     private static $_slave = null;//重数据库连接实例
  36.    
  37.     public $_config = array();//数据库连接配置信息
  38.     public $_res = null;//查询实例句柄
  39.     public $_flag = '';//标识当前语句是在主还是重数据库上执行
  40.     public $_link = null;
  41.    
  42.     /**
  43.      * 单实例
  44.      * Enter description here ...
  45.      * @param unknown_type $dbname
  46.      * @param unknown_type $mode
  47.      */
  48.     public static function & getInstance($dbname='',$mode='rw'){
  49.         if (is_null(self::$_instance)){
  50.             self::$_instance = new self();
  51.             self::$_instance->__getConf();
  52.             self::$_instance->connect($dbname,$mode);
  53.         }
  54.         
  55.         return self::$_instance;
  56.     }

  57.     /**
  58.      * 获取数据库配置信息
  59.      * Enter description here ...
  60.      */
  61.     public function __getConf(){
  62.         global $db_config;
  63.         $this->_config['master'] = $db_config['master'];
  64.         $this->_config['slave'] = $db_config['slave'];
  65.     }
  66.    
  67.     /**
  68.      * 数据库连接
  69.      * Enter description here ...
  70.      * @param $dbname 指定连接的数据库名,默认情况下连接配置文件的库
  71.      * @param $mode rw表示连接主库,r-w表示读写分离   
  72.      */
  73.     public function connect($dbname='',$mode = 'rw'){
  74.         if($mode == 'rw'){
  75.             if(is_null(self::$_master)){
  76.                 $this->_master = $this->_slave = $this->conn_master($dbname);
  77.             }
  78.         }else{
  79.             if(is_null(self::$_master)){
  80.                 $this->_master = $this->conn_master($dbname);
  81.             }
  82.             if(is_null(self::$_slave)){
  83.                 $this->_slave = $this->conn_slave($dbname);
  84.             }
  85.         }
  86.     }
  87.    
  88.     /**
  89.      * 连接到主数据库服务器
  90.      * Enter description here ...
  91.      */
  92.     public function conn_master($dbname=''){
  93.         $_link = mysql_connect($this->_config['master']['host'],$this->_config['master']['user'],$this->_config['master']['passwd'],true) or die ("Connect ".$this->_config['master']['host']." fail.");
  94.         mysql_select_db(empty($dbname)?$this->_config['master']['db']:$dbname,$_link) or die(" The DB name ".$this->_config['master']['db']." is not exists.");
  95.         mysql_query("set names utf8",$_link);
  96.         return $_link;
  97.     }
  98.    
  99.     /**
  100.      * 连接到从数据库服务器
  101.      * Enter description here ...
  102.      */
  103.     public function conn_slave($dbname=''){
  104.         $offset = rand(0,count($this->_config['slave'])-1);
  105.         $_link = @mysql_connect($this->_config['slave'][$offset]['host'],$this->_config['slave'][$offset]['user'],$this->_config['slave'][$offset]['passwd'],true) or die(" Connect ".$this->_config['slave'][$offset]['host']." fail.");
  106.         mysql_select_db(empty($dbname)?$this->_config['slave'][$offset]['db']:$dbname,$_link) or die(" The DB name ".$this->_config['slave'][$offset]['db']." is not exists.");
  107.         mysql_query("set names utf8",$_link);
  108.         return $_link;
  109.     }

  110.     /**
  111.      * 执行数据库查询
  112.      * Enter description here ...
  113.      * @param string $sql
  114.      */
  115.     public function query($sql,$master=true){

  116.         if($master == true || (substr(strtolower($sql),0,6) != 'select') && $master == false){
  117.             $this->_res = mysql_query($sql,$this->_master);
  118.             if(!$this->_res){
  119.                 $this->_error[] = mysql_error($this->_master);
  120.             }
  121.             $this->_flag = 'master';
  122.             $this->_link = $this->_master;
  123.         } else {
  124.             $this->_res = mysql_query($sql,$this->_slave);
  125.             if(!$this->_res){
  126.                 $this->_error[] = mysql_error($this->_slave);
  127.             }
  128.             $this->_flag = 'slave';
  129.             $this->_link = $this->_slave;
  130.         }

  131.         return $this->_res;
  132.     }
  133.    
  134.     /**
  135.      * 获取单行记录
  136.      * Enter description here ...
  137.      * @param mixed $rs
  138.      */
  139.     public function get($rs=''){
  140.         if(empty($rs)){
  141.             $rs = $this->_res;
  142.         }
  143.         return mysql_fetch_row($rs);
  144.     }
  145.    
  146.     /**
  147.      * 获取多行记录
  148.      * Enter description here ...
  149.      * @param mixed $rs
  150.      * @param  $result_type
  151.      */
  152.     public function fetch($rs = ''){
  153.         if(empty($rs)){
  154.             $rs = $this->_res;
  155.         }
  156.         return mysql_fetch_array($rs,MYSQL_ASSOC);
  157.     }
  158.    
  159.     /**
  160.      * 插入数据
  161.      * Enter description here ...
  162.      * @param unknown_type $sql
  163.      */
  164.     public function add($sql){
  165.         $rs = $this->query($sql);
  166.         if($rs)
  167.             return mysql_insert_id($this->_link);
  168.         return false;
  169.     }
  170.    
  171.     /**
  172.      * 更新数据
  173.      * Enter description here ...
  174.      * @param unknown_type $sql
  175.      */
  176.     public function update($sql){
  177.         if(empty($sql)) return false;
  178.         $rs = $this->query($sql);
  179.         if($rs)
  180.             return $this->fetchNum();
  181.         return false;
  182.     }

  183.     /**
  184.      * 获取上一条语句影响的行数
  185.      * Enter description here ...
  186.      */
  187.     public function fetchNum(){
  188.         return mysql_affected_rows($this->_link);
  189.     }
  190.    
  191.     /**
  192.      * 析构函数,释放数据库连接资源
  193.      * Enter description here ...
  194.      */
  195.     public function __destruct(){
  196.         mysql_close($this->_link);
  197.     }
  198. }
复制代码

db.class.php (6.48 KB, 下载次数: 41)
已有 1 人评分积分 收起 理由
gyl4802959 + 12 精品文章

总评分: 积分 + 12   查看全部评分

&amp;lt;-sina_sign,1703616862,29fb6047,1-&amp;gt;

Rank: 3Rank: 3

注册时间
2010-9-10
最后登录
2011-10-22
在线时间
29 小时
阅读权限
30
积分
451
帖子
68
主题
2
精华
0
UID
10350
发表于 2011-1-7 16:40:44 |显示全部楼层
多谢分享。

使用道具 举报

Rank: 6Rank: 6

注册时间
2009-7-22
最后登录
2015-4-25
在线时间
141 小时
阅读权限
70
积分
5335
帖子
128
主题
7
精华
0
UID
4353
发表于 2011-1-7 17:12:47 |显示全部楼层
不错.收藏了

使用道具 举报

Rank: 6Rank: 6

注册时间
2009-3-24
最后登录
2017-8-11
在线时间
120 小时
阅读权限
70
积分
6249
帖子
55
主题
1
精华
0
UID
2107
发表于 2011-1-7 17:44:22 |显示全部楼层
经典~~珍藏!!

使用道具 举报

Rank: 8Rank: 8

注册时间
2010-8-19
最后登录
2017-2-4
在线时间
467 小时
阅读权限
90
积分
26066
帖子
210
主题
11
精华
0
UID
10152
发表于 2011-1-20 08:56:52 |显示全部楼层
看不懂,正在研究perl ,呵呵呵,谢谢楼主无私的分享,我会想你的 :lol

使用道具 举报

Rank: 9Rank: 9Rank: 9

注册时间
2010-7-31
最后登录
2017-2-28
在线时间
10 小时
阅读权限
200
积分
1050
帖子
25
主题
2
精华
0
UID
9970
发表于 2011-1-23 09:57:07 |显示全部楼层
很不错.感谢分享.

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

IT运维专家网感谢您的支持

合作联系: QQ:67888954/MSN:cnseek@msn.com/mail:netseek@linuxtone.org

Archiver|手机版|感谢所有关心和支持过LinuxTone的朋友们 转载本站内容请注明原作者名及出处 ( 京ICP备08103151 )   |

GMT+8, 2019-1-16 09:57 , Processed in 0.025838 second(s), 17 queries , Apc On.

Powered by Discuz! X2 Licensed

© 2001-2011 Comsenz Inc.

回顶部