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

5年以前  |  阅读数:374 次  |  编程语言:PHP 

本文实例讲述了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.jb51.net/code/jb51_php_format进行了格式化处理。

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php+mysql数据库操作入门教程》、《php+mysqli数据库程序设计技巧总结》、《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《PHP网络编程技巧总结》及《php常见数据库操作技巧汇总

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

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例