PHP实现的Mysql读写分离

PHP中文网
发布: 2017-04-01 16:31:52
原创
977人浏览过

php实现的mysql读写分离

主要特性

  1. 简单的读写分离

  2. 一个主数据库,可以添加更多的只读数据库

  3. 读写分离但不用担心某些特性不支持

    立即学习PHP免费学习笔记(深入)”;

  4. 缺点:同时连接两个数据库

英文比较烂,也写几个字吧

1

2

3

4

5

6

php code for mysql read/write split

feature:

simply rw split

one master,can add more slaves

support all mysql feature

link to the master and slave at the same time

登录后复制

PHP代码

mysql_rw_php.class.php

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

<?php

 

/****************************************

*** mysql-rw-php version 0.1 @ 2009-4-16

*** code by hqlulu#gmail.com

*** http://www.aslibra.com

*** http://code.google.com/p/mysql-rw-php/

*** code modify from class_mysql.php (uchome)

****************************************/

 

class mysql_rw_php {

 

   //查询个数

   var $querynum = 0;

   //当前操作的数据库连接

   var $link = null;

   //字符集

   var $charset;

   //当前数据库

   var $cur_db = '';

 

   //是否存在有效的只读数据库连接

   var $ro_exist = false;

   //只读数据库连接

   var $link_ro = null;

   //读写数据库连接

   var $link_rw = null;

 

   function mysql_rw_php(){

   }

 

   function connect($dbhost, $dbuser, $dbpw, $dbname = '', $pconnect = 0, $halt = TRUE) {

     if($pconnect) {

       if(!$this->link = @mysql_pconnect($dbhost, $dbuser, $dbpw)) {

         $halt && $this->halt('Can not connect to MySQL server');

       }

     } else {

       if(!$this->link = @mysql_connect($dbhost, $dbuser, $dbpw)) {

         $halt && $this->halt('Can not connect to MySQL server');

       }

     }

     

     //只读连接失败

     if(!$this->link && !$halt) return false;

     

     //未初始化rw时,第一个连接作为rw

     if($this->link_rw == null)

       $this->link_rw = $this->link;

 

     if($this->version() > '4.1') {

       if($this->charset) {

         @mysql_query("SET character_set_connection=$this->charset,

         character_set_results=$this->charset, character_set_client=binary", $this->link);

       }

       if($this->version() > '5.0.1') {

         @mysql_query("SET sql_mode=''", $this->link);

       }

     }

     if($dbname) {

       $this->select_db($dbname);

     }

   }

 

   //连接一个只读的mysql数据库

   function connect_ro($dbhost, $dbuser, $dbpw, $dbname = '', $pconnect = 0){

     if($this->link_rw == null)

       $this->link_rw = $this->link;

     $this->link = null;

     //不产生halt错误

     $this->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect, false);

     if($this->link){

       //连接成功

       //echo "link ro sussess!<br>";

       $this->ro_exist = true;

       $this->link_ro = $this->link;

       if($this->cur_db){

         //如果已经选择过数据库则需要操作一次

         @mysql_select_db($this->cur_db, $this->link_ro);

       }

     }else{

       //连接失败

       //echo "link ro failed!<br>";

       $this->link = &$this->link_rw;

     }

   }

 

   //设置一系列只读数据库并且连接其中一个

   function set_ro_list($ro_list){

     if(is_array($ro_list)){

       //随机选择其中一个

       $link_ro = $ro_list[array_rand($ro_list)];

       $this->connect_ro($link_ro['dbhost'], $link_ro['dbuser'], $link_ro['dbpw']);

     }

   }

 

   function select_db($dbname) {

     //同时操作两个数据库连接

     $this->cur_db = $dbname;

     if($this->ro_exist){

       @mysql_select_db($dbname, $this->link_ro);

     }

     return @mysql_select_db($dbname, $this->link_rw);

   }

 

   function fetch_array($query, $result_type = MYSQL_ASSOC) {

     return mysql_fetch_array($query, $result_type);

   }

 

   function fetch_one_array($sql, $type = '') {

     $qr = $this->query($sql, $type);

     return $this->fetch_array($qr);

   }

 

   function query($sql, $type = '') {

     $this->link = &$this->link_rw;

     //判断是否select语句

     if($this->ro_exist && preg_match ("/^(\s*)select/i", $sql)){

       $this->link = &$this->link_ro;

     }

     $func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ?

       'mysql_unbuffered_query' : 'mysql_query';

     if(!($query = $func($sql, $this->link)) && $type != 'SILENT') {

       $this->halt('MySQL Query Error', $sql);

     }

     $this->querynum++;

     return $query;

   }

 

   function affected_rows() {

     return mysql_affected_rows($this->link);

   }

 

   function error() {

     return (($this->link) ? mysql_error($this->link) : mysql_error());

   }

 

   function errno() {

     return intval(($this->link) ? mysql_errno($this->link) : mysql_errno());

   }

 

   function result($query, $row) {

     $query = @mysql_result($query, $row);

     return $query;

   }

 

   function num_rows($query) {

     $query = mysql_num_rows($query);

     return $query;

   }

 

   function num_fields($query) {

     return mysql_num_fields($query);

   }

 

   function free_result($query) {

     return mysql_free_result($query);

   }

 

   function insert_id() {

     return ($id = mysql_insert_id($this->link)) >= 0 ? $id :

     $this->result($this->query("SELECT last_insert_id()"), 0);

   }

 

   function fetch_row($query) {

     $query = mysql_fetch_row($query);

     return $query;

   }

 

   function fetch_fields($query) {

     return mysql_fetch_field($query);

   }

 

   function version() {

     return mysql_get_server_info($this->link);

   }

 

   function close() {

     return mysql_close($this->link);

   }

 

   function halt($message = '', $sql = '') {

     $dberror = $this->error();

     $dberrno = $this->errno();

     echo "<div style=\"position:absolute;font-size:11px;font-family:verdana,arial;background:#EBEBEB;

     padding:0.5em;\">

         <b>MySQL Error</b><br>

         <b>Message</b>: $message<br>

         <b>SQL</b>: $sql<br>

         <b>Error</b>: $dberror<br>

         <b>Errno.</b>: $dberrno<br>

         </div>";

     exit();

   }

}

 

?>

登录后复制

example.php

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

<?php

 

/****************************************

*** mysql-rw-php version 0.1 @ 2009-4-16

*** code by hqlulu#gmail.com

*** http://www.aslibra.com

*** http://code.google.com/p/mysql-rw-php/

*** code modify from class_mysql.php (uchome)

****************************************/

 

require_once('mysql_rw_php.class.php');

 

//rw info

$db_rw = array(

   'dbhost'=>'www.aslibra.com',

   'dbuser'=>'aslibra',

   'dbpw'=>'www.aslibra.com',

   'dbname'=>'test'

);

 

$db_ro = array(

   array(

     'dbhost'=>'www.aslibra.com:4306',

     'dbuser'=>'aslibra',

     'dbpw'=>'www.aslibra.com'

   )

);

 

$DB = new mysql_rw_php;

 

//connect Master

$DB->connect($db_rw[dbhost], $db_rw[dbuser], $db_rw[dbpw], $db_rw[dbname]);

 

//Method 1: connect one server

$DB->connect_ro($db_ro[0][dbhost], $db_ro[0][dbuser], $db_ro[0][dbpw]);

 

//Method 2: connect one server from a list by rand

$DB->set_ro_list($db_ro);

 

//send to rw

$sql = "insert into a set a='test'";

$DB->query($sql);

 

//send to ro

$sql = "select * from a";

$qr = $DB->query($sql);

while($row = $DB->fetch_array($qr)){

   echo $row[a];

}

?>

登录后复制

以上就是PHP实现的Mysql读写分离的内容,更多相关内容请关注PHP中文网(www.php.cn)!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号