zoukankan      html  css  js  c++  java
  • php实现MySQL读写分离

    MySQL读写分离有好几种方式 MySQL中间件 MySQL驱动层 代码控制

    关于 中间件 和 驱动层的方式这里不做深究  暂且简单介绍下 如何通过PHP代码来控制MySQL读写分离

    我们都知道 “读” 在SQL语句里是 “SELECT”,  ”写” 是 “INSERT”

    那么我们第一时间就应该想到 字符串截取 substr() 这个函数

    首先我们通过substr()函数来获取到 sql语句的前6个字符是否为 “SELECT” 如果是我们连接读服务器进行处理 如果不是 我们连接写服务器进行处理

    思路有了 那么就是代码了

     1 $querystr = strtolower(trim(substr($sql,0,6)));    //截取SQL语句字符串
     2 
     3 //如果是select,就连接slave(从)服务器
     4 if($querystr == 'select')
     5 {
     6   $slave_server='192.168.80.3::3306';
     7   $dsn="mysql:host=$slave_server;dbname=3d";
     8   $user='root';
     9   $pass='root';
    10   $dbh=new PDO($dsn, $user, $pass);
    11   $res=$dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);
    12 }
    13 //如果不是select,就连接master(主)服务器
    14 else
    15 {
    16   $master_server='192.168.33.22::3306';
    17   $dsn="mysql:host=$master_server;dbname=3dprintsys";
    18   $user='root';
    19   $pass='123456';
    20   $dbh=new PDO($dsn, $user, $pass);
    21   $res=$dbh->exec($sql);
    22 }

    上面的代码流程已经很清晰了 下面把代码整理为面向对象风格

     1 <?php
     2 class Db
     3 {
     4   private $res;
     5   function __construct($sql)
     6   {
     7     $querystr = strtolower(trim(substr($sql,0,6)));  //截取SQL语句字符串
     8     //如果是select,就连接slave(从)服务器
     9     if($querystr == 'select')
    10     {
    11       $res=$this->slave ($sql);
    12       $this->res=$res;
    13     }
    14     //如果不是select,就连接master(主)服务器
    15     else
    16     {
    17       $res=$this->master ($sql);
    18       $this->res=$res;
    19     }
    20   }
    21  
    22   /**
    23    * slave从库返回sql查询结果
    24    * @param $sql
    25    * @return array
    26    */
    27   private function slave ($sql){
    28 //由于现实中读服务器的数量可能在一个以上 会引出负载均衡问题 这里就不做阐述了 从服务器IP我就随机获取了
    29     $slave_ip=$this->get_slave_ip();
    30     $dsn="mysql:host=$slave_ip;dbname=test";
    31     $user='root';
    32     $pass='root123';
    33     $dbh=new PDO($dsn, $user, $pass);
    34     return $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);
    35   }
    36  
    37   /**master主库返回sql执行结果
    38    * @param $sql
    39    * @return int
    40    */
    41   private function master ($sql){
    42     $master_ip='192.168.80.3';
    43     $dsn="mysql:host=$master_ip;dbname=test";
    44     $user='root';
    45     $pass='root123';
    46     $dbh=new PDO($dsn, $user, $pass);
    47     return $dbh->exec($sql);
    48   }
    49  
    50   /**
    51    * 随机获取slave-ip
    52    * @return mixed
    53    */
    54   private function get_slave_ip(){
    55     $slave_ips=['192.168.0.1','192.168.0.2'];
    56     $count=count($slave_ips)-1;
    57     $index =mt_rand(0,$count);
    58     return $slave_ips[$index];
    59   }
    60  
    61   /**       
    62    * 获取结果
    63    * @return int
    64    */
    65   public function get_res(){
    66     return $this->res;
    67   }
    68 }
    69  
    70 $sql1 = "select * from ecs_goods_info ";
    71 $sql2 = "insert into ecs_goods_info (goods_name) values ('haha')";
    72 $sql3 = "delete from ecs_goods_info where id=199";
    73 $sql4 = "update ecs_goods_info set goods_name='金刚葫芦娃' where id=198";
    74  
    75 $db = new Db($sql1);
    76 //$db = new Db($sql2);
    77 //$db = new Db($sql3);
    78 //$db = new Db($sql4);
    79  
    80 var_dump($db->get_res());
    81 
    因为读写分离是建立在主从复制的基础上 所以下次为大家分享下主从复制的原理
  • 相关阅读:
    Django框架基础之序列化
    资产采集
    CMDB
    数据库--三层架构
    Django 项目一补充
    评论楼
    图片预览
    验证码
    如何使用C/C++动态库与静态库中的宏
    Matlab 直线方程、采样函数
  • 原文地址:https://www.cnblogs.com/we-jack/p/8204457.html
Copyright © 2011-2022 走看看