MySQL读写分离有好几种方式 MySQL中间件 MySQL驱动层 代码控制
关于 中间件 和 驱动层的方式这里不做深究 暂且简单介绍下 如何通过PHP代码来控制MySQL读写分离
我们都知道 “读” 在SQL语句里是 “SELECT”, ”写” 是 “INSERT”
那么我们第一时间就应该想到 字符串截取 substr() 这个函数
首先我们通过substr()函数来获取到 sql语句的前6个字符是否为 “SELECT” 如果是我们连接读服务器进行处理 如果不是 我们连接写服务器进行处理
思路有了 那么就是代码了
$querystr = strtolower(trim(substr($sql,0,6))); //截取SQL语句字符串 //如果是select,就连接slave(从)服务器 if($querystr == 'select') { $slave_server='192.168.80.3::3306'; $dsn="mysql:host=$slave_server;dbname=3d"; $user='root'; $pass='root'; $dbh=new PDO($dsn, $user, $pass); $res=$dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC); } //如果不是select,就连接master(主)服务器 else { $master_server='192.168.33.22::3306'; $dsn="mysql:host=$master_server;dbname=3dprintsys"; $user='root'; $pass='123456'; $dbh=new PDO($dsn, $user, $pass); $res=$dbh->exec($sql); }
上面的代码流程已经很清晰了 下面把代码整理为面向对象风格
<?php class Db { private $res; function __construct($sql) { $querystr = strtolower(trim(substr($sql,0,6))); //截取SQL语句字符串 //如果是select,就连接slave(从)服务器 if($querystr == 'select') { $res=$this->slave ($sql); $this->res=$res; } //如果不是select,就连接master(主)服务器 else { $res=$this->master ($sql); $this->res=$res; } } /** * slave从库返回sql查询结果 * @param $sql * @return array */ private function slave ($sql){ //由于现实中读服务器的数量可能在一个以上 会引出负载均衡问题 这里就不做阐述了 从服务器IP我就随机获取了 $slave_ip=$this->get_slave_ip(); $dsn="mysql:host=$slave_ip;dbname=test"; $user='root'; $pass='root123'; $dbh=new PDO($dsn, $user, $pass); return $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC); } /**master主库返回sql执行结果 * @param $sql * @return int */ private function master ($sql){ $master_ip='192.168.80.3'; $dsn="mysql:host=$master_ip;dbname=test"; $user='root'; $pass='root123'; $dbh=new PDO($dsn, $user, $pass); return $dbh->exec($sql); } /** * 随机获取slave-ip * @return mixed */ private function get_slave_ip(){ $slave_ips=['192.168.0.1','192.168.0.2']; $count=count($slave_ips)-1; $index =mt_rand(0,$count); return $slave_ips[$index]; } /** * 获取结果 * @return int */ public function get_res(){ return $this->res; } } $sql1 = "select * from ecs_goods_info "; $sql2 = "insert into ecs_goods_info (goods_name) values ('haha')"; $sql3 = "delete from ecs_goods_info where id=199"; $sql4 = "update ecs_goods_info set goods_name='金刚葫芦娃' where id=198"; $db = new Db($sql1); //$db = new Db($sql2); //$db = new Db($sql3); //$db = new Db($sql4); var_dump($db->get_res());
因为读写分离是建立在主从复制的基础上 所以下次为大家分享下主从复制的原理
转载请注明:有客帮 » php实现MySQL读写分离