PHP+MYSQL实现读写分离简单实战


Posted in PHP onMarch 13, 2017

1、Introduction

之前写过2篇文章,分别是:

Mysql主从同步的原理 

Myql主从同步实战 

基于此,我们再实现简单的PHP+Mysql读写分离,从而提高数据库的负载能力。

2、代码实战

<?php
class Db
{
  private $res;
  function __construct($sql)
  {
    $querystr = strtolower(trim(substr($sql,0,6)));
    //如果是select,就连接slave服务器
    if($querystr == 'select')
    {
      $res=$this->slave_select($sql);
      $this->res=$res;
    }
    //如果不是select,就连接master服务器
    else
    {
      $res=$this->master_change($sql);
      $this->res=$res;
    }
  }

  /**
   * slave从库返回sql查询结果
   * @param $sql
   * @return array
   */
  private function slave_select($sql){
    //该处只是随机获取slave节点的ip,当然,还可以采用其他算法获取slave_ip
    $slave_server=$this->get_slave_ip();
    $dsn="mysql:host=$slave_server;dbname=test";
    $user='root';
    $pass='123456';
    $dbh=new PDO($dsn, $user, $pass);
    return $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);
  }

  /**master主库返回sql执行结果
   * @param $sql
   * @return int
   */
  private function master_change($sql){
    $master_server='192.168.33.22';
    $dsn="mysql:host=$master_server;dbname=test";
    $user='root';
    $pass='123456';
    $dbh=new PDO($dsn, $user, $pass);
    return $dbh->exec($sql);
  }

  /**
   * 随机获取slave-ip
   * @return mixed
   */
  private function get_slave_ip(){
    $slave_ips=['192.168.33.33','192.168.33.44'];
    $count=count($slave_ips)-1;
    $random_key=mt_rand(0,$count);
    return $slave_ips[$random_key];
  }

  /**       
   * 获取结果
   * @return int
   */
  public function get_res(){
    return $this->res;
  }
}

$sql1 = "select * from t1";
$sql2 = "insert into t1 (name) values ('haha')";
$sql3 = "delete from t1 where id=1";
$sql4 = "update t1 set name='Jerry' where id=2";

$db = new Db($sql1);
//$db = new Db($sql2);
//$db = new Db($sql3);
//$db = new Db($sql4);

var_dump($db->get_res());

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP聊天室技术
Oct 09 PHP
获得Google PR值的PHP代码
Jan 28 PHP
PHP判断文件是否存在、是否可读、目录是否存在的代码
Oct 03 PHP
php 强制下载文件实现代码
Oct 28 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
Nov 12 PHP
Laravel框架学习笔记(一)环境搭建
Oct 15 PHP
php给每个段落添加空格的方法
Mar 20 PHP
Yii2 assets清除缓存的方法
May 16 PHP
PHP判断密码强度的方法详解
May 26 PHP
PHP获取访问设备信息的方法示例
Feb 20 PHP
Centos7安装swoole扩展操作示例
Mar 26 PHP
PHP与Web页面的交互示例详解一
Aug 04 PHP
PHP计算近1年的所有月份
Mar 13 #PHP
PHP解耦的三重境界(浅谈服务容器)
Mar 13 #PHP
PHP控制反转(IOC)和依赖注入(DI)
Mar 13 #PHP
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解
Mar 13 #PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
Mar 13 #PHP
php解析mht文件转换成html的实例
Mar 13 #PHP
使用phpQuery获取数组的实例
Mar 13 #PHP
You might like
Yii调试查看执行SQL语句的方法
2016/07/15 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
2018/05/28 PHP
javascript小数计算出现近似值的解决办法
2010/02/06 Javascript
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
2010/04/29 Javascript
javascript面向对象入门基础详细介绍
2012/09/05 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
JavaScript实现多维数组的方法
2013/11/20 Javascript
jQuery学习笔记之基础中的基础
2015/01/19 Javascript
javascript常用方法总结
2015/05/14 Javascript
Javascript类型转换的规则实例解析
2016/02/23 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
使用bootstrap3开发响应式网站
2016/05/12 Javascript
jQuery如何跳转到另一个网页 就这么简单
2016/12/28 Javascript
d3.js入门教程之数据绑定详解
2017/04/28 Javascript
使用JavaScript实现在页面中显示距离2017年中秋节的天数
2017/09/26 Javascript
vue打包后显示空白正确处理方法
2017/11/01 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
利用jqprint插件打印页面内容的实现方法
2018/01/09 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
2019/04/15 Javascript
深入了解query和params的使用区别
2019/06/24 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
原生JS实现京东查看商品点击放大
2020/12/21 Javascript
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
Python urls.py的三种配置写法实例详解
2017/04/28 Python
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
Python实现TCP通信的示例代码
2019/09/09 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
Python常用数字处理基本操作汇总
2020/09/10 Python
CSS3贝塞尔曲线示例:创建链接悬停动画效果
2020/11/19 HTML / CSS
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
2015年度个人工作总结报告
2015/10/24 职场文书