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 相关文章推荐
计算2000年01月01日起到指定日的天数
Oct 09 PHP
开发大型 PHP 项目的方法
Jan 02 PHP
PHP __autoload()方法真的影响性能吗?
Mar 30 PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
Feb 14 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
Jun 05 PHP
PHP使用NuSOAP调用Web服务的方法
Jul 18 PHP
Zend Framework动作助手Redirector用法实例详解
Mar 05 PHP
PHP框架Laravel插件Pagination实现自定义分页
Apr 22 PHP
php PDO实现的事务回滚示例
Mar 23 PHP
THINKPHP3.2使用soap连接webservice的解决方法
Dec 13 PHP
PHP实现的策略模式示例
Mar 20 PHP
php 策略模式原理与应用深入理解
Sep 25 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
php 三维饼图的实现代码
2008/09/28 PHP
PHP网站开发中常用的8个小技巧
2015/02/13 PHP
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
PHP简单实现数字分页功能示例
2016/08/24 PHP
对JavaScript的eval()中使用函数的进一步讨论
2008/07/26 Javascript
自己开发Dojo的建议框架
2008/09/24 Javascript
javascript 客户端验证上传图片的大小(兼容IE和火狐)
2009/08/15 Javascript
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
jquery 如何动态添加、删除class样式方法介绍
2012/11/07 Javascript
js获取当前日期前七天的方法
2015/02/28 Javascript
浅谈javascript获取元素transform参数
2015/07/24 Javascript
jQuery移动web开发中的页面初始化与加载事件
2015/12/03 Javascript
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
vue-cli 如何打包上线的方法示例
2018/05/08 Javascript
详解无限滚动插件vue-infinite-scroll源码解析
2019/05/12 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
Python中struct模块对字节流/二进制流的操作教程
2017/01/21 Python
Python排序算法之选择排序定义与用法示例
2018/04/29 Python
解读python如何实现决策树算法
2018/10/11 Python
Python实现自动签到脚本功能
2020/08/20 Python
使用Python实现音频双通道分离
2020/12/25 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
互动出版网:专业书籍
2017/03/21 全球购物
城市轨道专业个人求职信范文
2013/09/23 职场文书
计算机专业推荐信范文
2013/11/27 职场文书
应用英语专业自荐信
2014/01/26 职场文书
妇产医师自荐信
2014/01/29 职场文书
党委班子剖析材料
2014/08/21 职场文书
2014年涉外离婚协议书范本
2014/11/20 职场文书
2019同学聚会主持词
2019/05/06 职场文书
python tqdm用法及实例详解
2021/06/16 Python