php实现的mysqldb读写分离操作类示例


Posted in PHP onFebruary 07, 2017

本文实例讲述了php实现的mysqldb读写分离操作类。分享给大家供大家参考,具体如下:

/**
* php MysqlDB 读写分离类
* -----------------------------------------------------
* $Source: http://code.ilaopo.net/php.class.mysqldb $
* $Author: Bevin Chen $
* $Email: bevin#lifa8.cn $
* $Date: 2009-10-10 $
* -----------------------------------------------------
*/
class mysqldb {
  var $querynum = 0;
  var $linkr,$linkw,$charset,$pconnect,$dbconfig;
  function __constructor($dbarray) {
    $this->mysqldb($dbarray);
  }
  function mysqldb($dbarray,$dbcharset='utf8',$pcontent=0) {
    if(!is_array($dbarray[0])) {
      echo "数据库参数错误";
      return false;
    }
    $this->charset = $dbcharset;
    $this->pconnect = $pconnect;
    $this->dbconfig['master'] = $dbarray[0];
    $dbServerNum = count($dbarray);
    if($dbServerNum > 1) {
      /*
  * 当x=1 时,$dbarray[0]不作slave
  * 当x=0 时,$dbarray[0]作slave
  */
      $x = 1;
      $rand = rand($x,$dbServerNum-1);
      $this->dbconfig['slave'] = $dbarray[$rand];
    } else {
      $this->dbconfig['slave'] = false;
    }
  }
  function connect($dbhost,$dbuser,$dbpw,$dbname) {
    if($this->pconnect) {
      $link = @mysql_pconnect($dbhost, $dbuser, $dbpw);
    } else {
      $link = @mysql_connect($dbhost, $dbuser, $dbpw, 1);
    }
    if($link) {
      if($this->version($link) > '4.1') {
        if($this->charset) {
          @mysql_query("SET character_set_connection=".$this->charset.", character_set_results=".$this->charset.", character_set_client=binary", $link);
        }
        if($this->version($link) > '5.0.1') {
          @mysql_query("SET sql_mode=''", $link);
        }
      }
      if($dbname) {
        @mysql_select_db($dbname, $link);
      }
      //print_r($link);
      return $link;
    } else {
      return false;
    }
  }
  function connectM() {
    if(!$this->linkw = $this->connect($this->dbconfig['master'][0],$this->dbconfig['master'][1],$this->dbconfig['master'][2],$this->dbconfig['master'][3])) {
      exit("主数据库连接失败!");
    }
    //echo "<br>##connectM!.<br>";
  }
  function connectS() {
    if($this->dbconfig['slave']) {
      if(!$this->linkr = $this->connect($this->dbconfig['slave'][0],$this->dbconfig['slave'][1],$this->dbconfig['slave'][2],$this->dbconfig['slave'][3])) {
        $this->dbconfig['slave'] = false;
        $this->connectS();
      }
      //echo "<br>##connectS!.<br>";
    } else {
      if(!$this->linkw) {
        $this->connectM();
      }
      $this->linkr = $this->linkw;
    }
  }
  // db read
  function query($sql, $type = '') {
    if(!$this->linkr) {
      $this->connectS();
    }
    $func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ?
      'mysql_unbuffered_query' : 'mysql_query';
    $query = $func($sql, $this->linkr);
    $this->querynum++;
    return $query;
  }
  function fetch_array($query, $result_type = MYSQL_ASSOC) {
    return @mysql_fetch_array($query, $result_type);
  }
  function fetch_row($query) {
    $query = mysql_fetch_row($query);
    return $query;
  }
  function fetch_One($sql) {
    $query = $this->query($sql);
    return $this->fetch_row($query);
  }
  /* 获取分页方法 */
  function fetch_page($sql, $pagenum) {
    $page = intval($_GET['page']);
    $query = $this->query($sql);
    $countnum = $this->num_rows($query);
    $countpage = ceil($countnum/$pagenum);
    if($page<1) {
      $page=1;
    }
    if($page>$countpage) {
      $page=$countpage;
    }
    $limitstart = ($page-1)*$pagenum;
    /* 获取数据结果集 */
    for ($i=0; $i<($limitstart+$pagenum); $i++) {
      if($i>=$countnum) {
        break;
      }
      if($i>=$limitstart) {
        $result[] = $this->fetch_array($query);
      } else {
        $this->fetch_array($query);
      }
    }
    /* 生成url */
    $url = $_SERVER['QUERY_STRING'];
    $url = preg_replace("/&?page=[0-9]+/i","",$url);
    $array['countnum'] = $countnum;
    $array['countpage'] = $countpage;
    $array['result'] = $result;
    $array['page'] = $page;
    if($page>1) {
      $array['preurl'] = "?".$url."&page=".($page-1);
      $array['prepage'] = $page-1;
    } else {
      $array['preurl'] = "?".$url."&page=1";
      $array['prepage'] = 1;
    }
    if($page<$countpage) {
      $array['nexturl'] = "?".$url."&page=".($page+1);
      $array['nextpage'] = $page+1;
    } else {
      $array['nexturl'] = "?".$url."&page=".$countpage;
      $array['nextpage'] = $countpage;
    }
    $array['firsturl'] = "?".$url."&page=1";
    $array['firstpage'] = 1;
    $array['lasturl'] = "?".$url."&page=".$countpage;
    $array['lastpage'] = $countpage;
    $array['nopage'] = "?".$url."&page=";
    return $array;
  }
  // db write
  function queryw($sql, $type = '') {
    if(!$this->linkw) {
      $this->connectM();
    }
    $func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ?
      'mysql_unbuffered_query' : 'mysql_query';
    $query = $func($sql, $this->linkw);
    $this->querynum++;
    return $query;
  }
  function update($table,$where,$array) {
    $whereset = $set = $dot = '';
    foreach($array as $key=>$value) {
      $set .= $dot." `$key`='$value'";
      $dot = ',';
    }
    $whereset = $dot = '';
    foreach($where as $k=>$v) {
      $whereset .= $dot." `$k`='$v'";
      $dot = ' and ';
    }
    $sql = "update $table set $set where $whereset";
    return $this->queryw($sql);
  }
  function insert($table,$array) {
    $col = $v = $dot = '';
    foreach($array as $key=>$value) {
      $v .= $dot."'$value'";
      $col .= $dot."`$key`";
      $dot = ',';
    }
    $sql = "insert into $table ($col) values ($v)";
    if($this->queryw($sql)) {
      return $this->insert_id();
    } else {
      return false;
    }
  }
  function insert_id() {
    return ($id = mysql_insert_id($this->linkw)) >= 0 ? $id : $this->result($this->queryw("SELECT last_insert_id()"), 0);
  }
  // db other
  function affected_rows($link) {
    return mysql_affected_rows($link);
  }
  function error($link) {
    return (($link) ? mysql_error($link) : mysql_error());
  }
  function errno($link) {
    return intval(($link) ? mysql_errno($link) : mysql_errno());
  }
  function result($query, $row) {
    $query = @mysql_result($query, $row);
    return $query;
  }
  function num_rows($query) {
    $query = mysql_num_rows($query);
    return $query;
  }
  function num_fields($query) {
    return mysql_num_fields($query);
  }
  function free_result($query) {
    return mysql_free_result($query);
  }
  function fetch_fields($query) {
    return mysql_fetch_field($query);
  }
  function version($link) {
    return mysql_get_server_info($link);
  }
  function close($link) {
    return mysql_close($link);
  }
}
/* 测试例子 //
* $dbarray[] = array('localhost','bevin','password','test');
* $dbarray[] = array('ilaopo.net','root','password','test');
* $dbarray[] = array('192.168.1.77','cxh','password','test');
* $newdb = new mysqldb($dbarray,'utf8');
* $array = array('name' => date("Y-m-d H:i:s"));
* $id = $newdb->insert("test",$array);
* $result = $newdb->fetch_page("select * from test order by id desc",'10');
* print_r($result);
* $id = $newdb->insert("test",$array);
* echo $id;
*/

PS:为便于读者阅读源码,上述代码使用在线工具http://tools.3water.com/code/3water_php_format进行了格式化处理。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
FCKeditor添加自定义按钮
Mar 27 PHP
利用PHP制作简单的内容采集器的原理分析
Oct 01 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
Jul 04 PHP
解析php中heredoc的使用方法
Jun 17 PHP
根据中文裁减字符串函数的php代码
Dec 03 PHP
php使用ob_start()实现图片存入变量的方法
Nov 14 PHP
php使用cookie显示用户上次访问网站日期的方法
Jan 26 PHP
php数组去除空值函数分享
Feb 02 PHP
php使用memcoder将视频转成mp4格式的方法
Mar 12 PHP
php使用Jpgraph绘制柱形图的方法
Jun 10 PHP
discuz图片顺序混乱解决方案
Jul 29 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 PHP
PHP验证终端类型是否为手机的简单实例
Feb 07 #PHP
PHP实现多级分类生成树的方法示例
Feb 07 #PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
Feb 07 #PHP
php实现图片按比例截取的方法
Feb 06 #PHP
php实现的中文分词类完整实例
Feb 06 #PHP
PHPCMS手机站伪静态设置详细教程
Feb 06 #PHP
php使用变量动态创建类的对象用法示例
Feb 06 #PHP
You might like
php警告Creating default object from empty value 问题的解决方法
2014/04/02 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
IE FF OPERA都可用的弹出层实现代码
2009/09/29 Javascript
基于jquery的获取mouse坐标插件的实现代码
2010/04/01 Javascript
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
javascript实现设置、获取和删除Cookie的方法
2015/06/01 Javascript
AngularJS模仿Form表单提交的实现代码
2016/12/08 Javascript
详解angularjs利用ui-route异步加载组件
2017/05/21 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
2020/06/17 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
基于input动态模糊查询的实现方法
2017/12/12 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
2018/10/12 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
2019/03/29 Javascript
Vue实现购物车详情页面的方法
2019/08/20 Javascript
Vue使用Three.js加载glTF模型的方法详解
2020/06/14 Javascript
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
python中__slots__用法实例
2015/06/04 Python
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
浅谈pycharm的xmx和xms设置方法
2018/12/03 Python
Python使用reportlab模块生成PDF格式的文档
2019/03/11 Python
python+pyqt5实现图片批量缩放工具
2019/03/18 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
对python3中的RE(正则表达式)-详细总结
2019/07/23 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
python轮询机制控制led实例
2020/05/03 Python
python不到50行代码完成了多张excel合并的实现示例
2020/05/28 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
如果让你测试一台高速激光打印机,你都会进行哪些测试
2012/12/04 面试题
保荐人的岗位职责
2013/11/19 职场文书
小学敬老月活动方案
2014/02/11 职场文书
中学生操行评语
2014/04/24 职场文书
趣味运动会新闻稿
2015/07/17 职场文书
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技
彻底弄懂Python中的回调函数(callback)
2022/06/25 Python