php实现MySQL读写分离

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

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

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

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

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

思路有了 那么就是代码了

$querystr = strtolower(trim(substr($sql,0,6)));    //截取SQL语句字符串

//如果是select,就连接slave(从)服务器
if($querystr == 'select')
{
$slave_server='192.168.80.3::3306';
$dsn="mysql:host=$slave_server;dbname=3d";
$user='root';
$pass='root';
$dbh=new PDO($dsn, $user, $pass);
$res=$dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);
}
//如果不是select,就连接master(主)服务器
else
{
$master_server='192.168.33.22::3306';
$dsn="mysql:host=$master_server;dbname=3dprintsys";
$user='root';
$pass='123456';
$dbh=new PDO($dsn, $user, $pass);
$res=$dbh->exec($sql);
}

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

 <?php
class Db
{
  private $res;
  function __construct($sql)
  {
    $querystr = strtolower(trim(substr($sql,0,6)));  //截取SQL语句字符串
    //如果是select,就连接slave(从)服务器
    if($querystr == 'select')
    {
      $res=$this->slave ($sql);
      $this->res=$res;
    }
    //如果不是select,就连接master(主)服务器
    else
    {
      $res=$this->master ($sql);
      $this->res=$res;
    }
  }
 
  /**
   * slave从库返回sql查询结果
   * @param $sql
   * @return array
   */
  private function slave ($sql){
//由于现实中读服务器的数量可能在一个以上 会引出负载均衡问题 这里就不做阐述了 从服务器IP我就随机获取了
    $slave_ip=$this->get_slave_ip();
    $dsn="mysql:host=$slave_ip;dbname=test";
    $user='root';
    $pass='root123';
    $dbh=new PDO($dsn, $user, $pass);
    return $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);
  }
 
  /**master主库返回sql执行结果
   * @param $sql
   * @return int
   */
  private function master ($sql){
    $master_ip='192.168.80.3';
    $dsn="mysql:host=$master_ip;dbname=test";
    $user='root';
    $pass='root123';
    $dbh=new PDO($dsn, $user, $pass);
    return $dbh->exec($sql);
  }
 
  /**
   * 随机获取slave-ip
   * @return mixed
   */
  private function get_slave_ip(){
    $slave_ips=['192.168.0.1','192.168.0.2'];
    $count=count($slave_ips)-1;
    $index =mt_rand(0,$count);
    return $slave_ips[$index];
  }
 
  /**       
   * 获取结果
   * @return int
   */
  public function get_res(){
    return $this->res;
  }
}
 
$sql1 = "select * from ecs_goods_info ";
$sql2 = "insert into ecs_goods_info (goods_name) values ('haha')";
$sql3 = "delete from ecs_goods_info where id=199";
$sql4 = "update ecs_goods_info set goods_name='金刚葫芦娃' where id=198";
 
$db = new Db($sql1);
//$db = new Db($sql2);
//$db = new Db($sql3);
//$db = new Db($sql4);
 
var_dump($db->get_res());
因为读写分离是建立在主从复制的基础上 所以下次为大家分享下主从复制的原理

猜你喜欢

转载自blog.csdn.net/u012757419/article/details/90402260