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

作者:zilu 时间:2023-11-23 21:30:42 

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());

来源:https://segmentfault.com/a/1190000008664288

标签:读写分离,PHP,mysql
0
投稿

猜你喜欢

  • golang goquery selector选择器使用示例大全

    2023-10-14 15:40:58
  • 有用的:nth-child秘方

    2011-07-01 12:56:11
  • js正则的几个基本概念

    2007-09-30 20:02:00
  • Python远程控制Windows服务器的方法详解

    2023-07-13 13:14:03
  • 不能安装SQL Server 2005的问题及解决方法

    2008-12-26 17:41:00
  • GoLang使goroutine停止的五种方法实例

    2023-09-02 08:31:33
  • asp 在线备份与恢复sqlserver数据库的代码

    2011-03-06 11:14:00
  • 小结Python的反射机制

    2023-10-16 22:30:28
  • ASP 千万级数据分页的存储过程

    2011-04-14 11:08:00
  • 对fieldset和legend的默认样式一点分析

    2008-07-02 12:56:00
  • 说说页面中header的XHTML结构选择

    2008-06-09 12:49:00
  • 如何在一个广告旗帜里轮番显示时间长度不一的不同广告?

    2010-06-26 12:35:00
  • SQL Server 作业的备份(备份作业非备份数据库)

    2012-07-11 15:58:49
  • .NET反向代理组件YARP介绍

    2023-07-23 02:29:45
  • 详解Go 将在下个版本支持新型排序算法pdqsort

    2023-10-07 23:49:40
  • PHP中Too few arguments to function的问题及解决

    2023-06-04 21:15:55
  • 不成熟的标准化是我们唯一惧怕的

    2008-08-15 18:55:00
  • 解析:正确的理解SQL Server和XML支持

    2009-01-23 13:52:00
  • 分析SQL语句性能3种方法分享

    2012-06-06 20:09:30
  • 超酷的js图片轮播渐变效果

    2007-10-10 20:45:00
  • asp之家 网络编程 m.aspxhome.com