php实现MySQL读写分离
MySQL读写分离有好几种方式 MySQL中间件 MySQL驱动层 代码控制
关于 中间件 和 驱动层的方式这里不做深究 暂且简单介绍下 如何通过PHP代码来控制MySQL读写分离
我们都知道 “读” 在SQL语句里是 “SELECT”, ”写” 是 “INSERT”
那么我们第一时间就应该想到 字符串截取 substr() 这个函数
首先我们通过substr()函数来获取到 sql语句的前6个字符是否为 “SELECT” 如果是我们连接读服务器进行处理 如果不是 我们连接写服务器进行处理
思路有了 那么就是代码了
1 $querystr = strtolower(trim(substr($sql,0,6))); //截取SQL语句字符串
2
3 //如果是select,就连接slave(从)服务器
4 if($querystr == 'select')
5 {
6 $slave_server='192.168.80.3::3306';
7 $dsn="mysql:host=$slave_server;dbname=3d";
8 $user='root';
9 $pass='root';
10 $dbh=new PDO($dsn, $user, $pass);
11 $res=$dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);
12 }
13 //如果不是select,就连接master(主)服务器
14 else
15 {
16 $master_server='192.168.33.22::3306';
17 $dsn="mysql:host=$master_server;dbname=3dprintsys";
18 $user='root';
19 $pass='123456';
20 $dbh=new PDO($dsn, $user, $pass);
21 $res=$dbh->exec($sql);
22 }
上面的代码流程已经很清晰了 下面把代码整理为面向对象风格
1 <?php
2 class Db
3 {
4 private $res;
5 function __construct($sql)
6 {
7 $querystr = strtolower(trim(substr($sql,0,6))); //截取SQL语句字符串
8 //如果是select,就连接slave(从)服务器
9 if($querystr == 'select')
10 {
11 $res=$this->slave ($sql);
12 $this->res=$res;
13 }
14 //如果不是select,就连接master(主)服务器
15 else
16 {
17 $res=$this->master ($sql);
18 $this->res=$res;
19 }
20 }
21
22 /**
23 * slave从库返回sql查询结果
24 * @param $sql
25 * @return array
26 */
27 private function slave ($sql){
28 //由于现实中读服务器的数量可能在一个以上 会引出负载均衡问题 这里就不做阐述了 从服务器IP我就随机获取了
29 $slave_ip=$this->get_slave_ip();
30 $dsn="mysql:host=$slave_ip;dbname=test";
31 $user='root';
32 $pass='root123';
33 $dbh=new PDO($dsn, $user, $pass);
34 return $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);
35 }
36
37 /**master主库返回sql执行结果
38 * @param $sql
39 * @return int
40 */
41 private function master ($sql){
42 $master_ip='192.168.80.3';
43 $dsn="mysql:host=$master_ip;dbname=test";
44 $user='root';
45 $pass='root123';
46 $dbh=new PDO($dsn, $user, $pass);
47 return $dbh->exec($sql);
48 }
49
50 /**
51 * 随机获取slave-ip
52 * @return mixed
53 */
54 private function get_slave_ip(){
55 $slave_ips=['192.168.0.1','192.168.0.2'];
56 $count=count($slave_ips)-1;
57 $index =mt_rand(0,$count);
58 return $slave_ips[$index];
59 }
60
61 /**
62 * 获取结果
63 * @return int
64 */
65 public function get_res(){
66 return $this->res;
67 }
68 }
69
70 $sql1 = "select * from ecs_goods_info ";
71 $sql2 = "insert into ecs_goods_info (goods_name) values ('haha')";
72 $sql3 = "delete from ecs_goods_info where id=199";
73 $sql4 = "update ecs_goods_info set goods_name='金刚葫芦娃' where id=198";
74
75 $db = new Db($sql1);
76 //$db = new Db($sql2);
77 //$db = new Db($sql3);
78 //$db = new Db($sql4);
79
80 var_dump($db->get_res());
81
转载:https://www.cnblogs.com/we-jack/p/8204457.html

浙公网安备 33010602011771号