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";
8   $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());
因为读写分离是建立在主从复制的基础上 所以下次为大家分享下主从复制的原理

php实现MySQL读写分离的更多相关文章

  1. mysql读写分离(PHP类)

    mysql读写分离(PHP类) 博客分类: php mysql   自己实现了php的读写分离,并且不用修改程序 优点:实现了读写分离,不依赖服务器硬件配置,并且都是可以配置read服务器,无限扩展 ...

  2. amoeba实现MySQL读写分离

    amoeba实现MySQL读写分离 准备环境:主机A和主机B作主从配置,IP地址为192.168.131.129和192.168.131.130,主机C作为中间件,也就是作为代理服务器,IP地址为19 ...

  3. PHP代码实现MySQL读写分离

    关于MySQL的读写分离有几种方法:中间件,Mysql驱动层,代码控制 关于中间件和Mysql驱动层实现Mysql读写分离的方法,今天暂不做研究, 这里主要写一点简单的代码来实现由PHP代码控制MyS ...

  4. 转:Mysql读写分离实现的三种方式

    1 程序修改mysql操作类可以参考PHP实现的Mysql读写分离,阿权开始的本项目,以php程序解决此需求.优点:直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配缺点:自 ...

  5. 使用Atlas实现MySQL读写分离+MySQL-(Master-Slave)配置

    参考博文: MySQL-(Master-Slave)配置  本人按照博友北在北方的配置已成功  我使用的是 mysql5.6.27版本. 使用Atlas实现MySQL读写分离 数据切分——Atlas读 ...

  6. MySQL读写分离技术

    1.简介 当今MySQL使用相当广泛,随着用户的增多以及数据量的增大,高并发随之而来.然而我们有很多办法可以缓解数据库的压力.分布式数据库.负载均衡.读写分离.增加缓存服务器等等.这里我们将采用读写分 ...

  7. [记录]MySQL读写分离(Atlas和MySQL-proxy)

    MySQL读写分离(Atlas和MySQL-proxy) 一.阿里云使用Atlas从外网访问MySQL(RDS) (同样的方式修改配置文件可以实现代理也可以实现读写分离,具体看使用场景) 1.在跳板机 ...

  8. docker环境 mysql读写分离 mycat maxscale

    #mysql读写分离测试 环境centos 7.4 ,docker 17.12 ,docker-compose mysql 5.7 主从 mycat 1.6 读写分离 maxscale 2.2.4 读 ...

  9. mysql读写分离总结

    随着一个网站的业务不断扩展,数据不断增加,数据库的压力也会越来越大,对数据库或者SQL的基本优化可能达不到最终的效果,我们可以采用读写分离的策略来改变现状.读写分离现在被大量应用于很多大型网站,这个技 ...

随机推荐

  1. MySql基础入门-mysql的结构层次

    了解MySql必须牢牢记住其体系结构图,Mysql是由SQL接口,解析器,优化器,缓存,存储引擎组成的. 1.Connectors指的是不同语言中与SQL的交互 2.Management Servei ...

  2. php计算多个集合的笛卡尔积实例详解

    笛卡尔积 笛卡尔积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X*Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员. 假设集合A ...

  3. js(jquery)绑定点击事件

    <button type="submit" id="test">test</button> 第一种 $("#test" ...

  4. win10解决乱码问题

    Unicode是Unicode.org制定的编码标准,目前得到了绝大部分操作系统和编程语言的支持.Unicode.org官方对Unicode的定义是:Unicode provides a unique ...

  5. CS Round#53 E Maxor

    题意:给你N个数,你可以从中选出两个数将它们or起来得到M,求M的最大值及得到最大值的方案数. 刚了半个小时得到了一个貌似时O(N log max(Ai)^2)的方法,想了想发现貌似只能做出第一问,但 ...

  6. 对于vue.js初步了解

    由于本人做的是javaWeb的开发,对于前端的了解还是有限,今天对于vue.js了解了下(主要是看官方api),把自己的心得说一下,希望各位大神可以补充,谢谢   http://www.runoob. ...

  7. http请求报文格式和响应报文格式

    转载 出处 超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议.HTTP 是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求 ...

  8. Docker 运行Tensorboard 和 jupyter的正确方法

    Docker 运行Tensorboard 和 jupyter的正确方法 网上找了很多方法都是jupyter 运行正常但不知道如何打开Tensorboard.折腾了很久,实验很多中方法最终找到了一个正确 ...

  9. Oracle之PLSQL

    PL/SQL Developer是一个集成开发环境,专门开发面向Oracle数据库的应用.PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)它是Ora ...

  10. Java中enum的学习总结

    一.通常的定义常量的方法 public class Sex{ public final static int MALE = 1; public final static int FEMALE=2; } ...