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实现Socket服务器的代码
Apr 03 PHP
PHP开启gzip页面压缩实例代码
Mar 11 PHP
第七章 php自定义函数实现代码
Dec 30 PHP
php适配器模式介绍
Aug 14 PHP
PHP数据类型之布尔型的介绍
Apr 28 PHP
解析使用ThinkPHP应该掌握的调试手段
Jun 20 PHP
浅析php中如何在有限的内存中读取大文件
Jul 02 PHP
ThinkPHP路由详解
Jul 27 PHP
PHP基于反射机制实现插件的可插拔设计详解
Nov 10 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
Oct 12 PHP
PhpStorm本地断点调试的方法步骤
May 21 PHP
php原生数据库分页的代码实例
Feb 18 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网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
Laravel中使用自己编写类库的3种方法
2015/02/10 PHP
详解php魔术方法(Magic methods)的使用方法
2016/02/14 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
php实现socket推送技术的示例
2017/12/20 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
jQuery弹性滑动导航菜单实现思路及代码
2013/05/02 Javascript
解析offsetHeight,clientHeight,scrollHeight之间的区别
2013/11/20 Javascript
js 剪切板应用clipboardData详细解析
2013/12/17 Javascript
Node.js中创建和管理外部进程详解
2014/08/16 Javascript
JS原型对象的创建方法详解
2016/06/16 Javascript
详解使用nodeJs安装Vue-cli
2017/05/17 NodeJs
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
vue将时间戳转换成自定义时间格式的方法
2018/03/02 Javascript
JavaScript函数的特性与应用实践深入详解
2018/12/30 Javascript
taro小程序添加骨架屏的实现代码
2019/11/15 Javascript
js prototype深入理解及应用实例分析
2019/11/25 Javascript
如何在vue中使用kindeditor富文本编辑器
2020/12/19 Vue.js
Python的函数嵌套的使用方法
2014/01/24 Python
python中解析json格式文件的方法示例
2017/05/03 Python
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
Tensorflow累加的实现案例
2020/02/05 Python
html5 css3 动态气泡按钮实例演示
2012/12/02 HTML / CSS
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
英国最大的奢侈品零售网络商城:Flannels
2016/09/16 全球购物
鱼油专家:Omegavia
2016/10/10 全球购物
西班牙在线药店:DosFarma
2020/03/28 全球购物
青年文明号服务承诺
2014/03/31 职场文书
《厄运打不垮的信念》教学反思
2014/04/13 职场文书
大学毕业生推荐信
2014/07/09 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
入党团支部推荐意见
2015/06/02 职场文书
2016年学校党支部公开承诺书
2016/03/25 职场文书
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP