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 模板高级篇总结
Dec 21 PHP
PHP里8个鲜为人知的安全函数分析
Dec 09 PHP
php简单实现查询数据库返回json数据
Apr 16 PHP
thinkPHP中分页用法实例分析
Dec 26 PHP
php如何执行非缓冲查询API
Jul 22 PHP
ThinkPHP实现附件上传功能
Apr 27 PHP
php实现与python进行socket通信的方法示例
Aug 30 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
PHP迭代器接口Iterator用法分析
Dec 28 PHP
PHP生成随机数的方法总结
Mar 01 PHP
PHP工厂模式简单实现方法示例
May 23 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
May 27 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&amp;MYSQL留言板源码
2020/07/19 PHP
php设计模式 Singleton(单例模式)
2011/06/26 PHP
php数组函数序列之array_values() 获取数组元素值的函数与方法
2011/10/30 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
PHP receiveMail实现收邮件功能
2018/04/25 PHP
详解PHP实现支付宝小程序用户授权的工具类
2018/12/25 PHP
JSON 教程 json入门学习笔记
2020/09/22 Javascript
ExtJS中文乱码之GBK格式编码解决方案及代码
2013/01/20 Javascript
javascript中怎么做对象的类型判断
2013/11/11 Javascript
判断复选框是否被选中的两种方法
2014/06/04 Javascript
javascript的replace方法结合正则使用实例总结
2016/06/16 Javascript
vue+axios新手实践实现登陆的示例代码
2018/06/06 Javascript
JavaScript数组方法的错误使用例子
2018/09/13 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
js实现带搜索功能的下拉框
2020/01/11 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
[01:06] DOTA2英雄背景故事第三期之秩序法则光之守卫
2020/07/07 DOTA
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
2020/04/23 Python
用python处理图片之打开\显示\保存图像的方法
2018/05/04 Python
Python 使用PIL中的resize进行缩放的实例讲解
2018/08/03 Python
Django利用cookie保存用户登录信息的简单实现方法
2019/05/27 Python
wxpython绘制音频效果
2019/11/18 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
2020/02/13 Python
Python如何实现FTP功能
2020/05/28 Python
pytorch实现查看当前学习率
2020/06/24 Python
pyqt5 textEdit、lineEdit操作的示例代码
2020/08/12 Python
德国奢侈品网上商城:Mytheresa
2016/08/24 全球购物
DataReader和DataSet的异同
2014/12/31 面试题
会计专业自我鉴定范文
2013/12/29 职场文书
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
小学数学教研活动总结
2014/07/01 职场文书
交通工程专业推荐信
2014/09/06 职场文书
五年级上册复习计划
2015/01/19 职场文书