查看: 345|回复: 0

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

发表于 2018-2-6 08:00:01

1、Introduction

之前写过2篇文章,分别是:

Mysql主从同步的原理

Myql主从同步实战

基于此,我们再实现简单的PHP+Mysql读写分离,从而提高数据库的负载能力。

2、代码实战

  1. <?php
  2. class Db
  3. {
  4. private $res;
  5. function __construct($sql)
  6. {
  7. $querystr = strtolower(trim(substr($sql,0,6)));
  8. //如果是select,就连接slave服务器
  9. if($querystr == 'select')
  10. {
  11. $res=$this->slave_select($sql);
  12. $this->res=$res;
  13. }
  14. //如果不是select,就连接master服务器
  15. else
  16. {
  17. $res=$this->master_change($sql);
  18. $this->res=$res;
  19. }
  20. }
  21. /**
  22. * slave从库返回sql查询结果
  23. * @param $sql
  24. * @return array
  25. */
  26. private function slave_select($sql){
  27. //该处只是随机获取slave节点的ip,当然,还可以采用其他算法获取slave_ip
  28. $slave_server=$this->get_slave_ip();
  29. $dsn="mysql:host=$slave_server;dbname=test";
  30. $user='root';
  31. $pass='123456';
  32. $dbh=new PDO($dsn, $user, $pass);
  33. return $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);
  34. }
  35. /**master主库返回sql执行结果
  36. * @param $sql
  37. * @return int
  38. */
  39. private function master_change($sql){
  40. $master_server='192.168.33.22';
  41. $dsn="mysql:host=$master_server;dbname=test";
  42. $user='root';
  43. $pass='123456';
  44. $dbh=new PDO($dsn, $user, $pass);
  45. return $dbh->exec($sql);
  46. }
  47. /**
  48. * 随机获取slave-ip
  49. * @return mixed
  50. */
  51. private function get_slave_ip(){
  52. $slave_ips=['192.168.33.33','192.168.33.44'];
  53. $count=count($slave_ips)-1;
  54. $random_key=mt_rand(0,$count);
  55. return $slave_ips[$random_key];
  56. }
  57. /**
  58. * 获取结果
  59. * @return int
  60. */
  61. public function get_res(){
  62. return $this->res;
  63. }
  64. }
  65. $sql1 = "select * from t1";
  66. $sql2 = "insert into t1 (name) values ('haha')";
  67. $sql3 = "delete from t1 where id=1";
  68. $sql4 = "update t1 set name='Jerry' where id=2";
  69. $db = new Db($sql1);
  70. //$db = new Db($sql2);
  71. //$db = new Db($sql3);
  72. //$db = new Db($sql4);
  73. var_dump($db->get_res());
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持程序员之家。

您可能感兴趣的文章:

  • 使用PHP实现Mysql读写分离
  • Thinkphp实现MySQL读写分离操作示例
  • php实现带读写分离功能的MySQL类完整实例
  • php实现的mysqldb读写分离操作类示例


回复

使用道具 举报