php实现mysql读写分离_PHP实现的Mysql读写分离

这是一个PHP类库,用于管理读写分离的MySQL数据库连接。它支持连接到多个只读数据库,并在执行查询时自动根据SQL语句类型(SELECT vs. 非SELECT)选择合适的连接。类库还包括基本的数据库操作方法如查询、获取受影响行数、错误处理等。
摘要由CSDN通过智能技术生成

1 <?php2 /****************************************3 *** mysql-rw-php version 0.1 @ 2009-4-164 *** code by hqlulu#gmail.com5 *** http://www.aslibra.com6 *** http://code.google.com/p/mysql-rw-php/7 *** code modify from class_mysql.php (uchome)8 ****************************************/9 classmysql_rw_php {10 //查询个数11 var$querynum=0;12 //当前操作的数据库连接13 var$link=null;14 //字符集15 var$charset;16 //当前数据库17 var$cur_db='';18 //是否存在有效的只读数据库连接19 var$ro_exist=false;20 //只读数据库连接21 var$link_ro=null;22 //读写数据库连接23 var$link_rw=null;24 functionmysql_rw_php(){25 }26 functionconnect($dbhost,$dbuser,$dbpw,$dbname='',$pconnect=0,$halt=TRUE) {27 if($pconnect) {28 if(!$this->link=@mysql_pconnect($dbhost,$dbuser,$dbpw)) {29 $halt&&$this->halt('Can not connect to MySQL server');30 }31 }else{32 if(!$this->link=@mysql_connect($dbhost,$dbuser,$dbpw)) {33 $halt&&$this->halt('Can not connect to MySQL server');34 }35 }36 37 //只读连接失败38 if(!$this->link&&!$halt)returnfalse;39 40 //未初始化rw时,第一个连接作为rw41 if($this->link_rw==null)42 $this->link_rw=$this->link;43 if($this->version()>'4.1') {44 if($this->charset) {45 @mysql_query("SET character_set_connection=$this->charset, character_set_results=$this->charset, character_set_client=binary",$this->link);46 }47 if($this->version()>'5.0.1') {48 @mysql_query("SET sql_mode=''",$this->link);49 }50 }51 if($dbname) {52 $this->select_db($dbname);53 }54 }55 //连接一个只读的mysql数据库56 functionconnect_ro($dbhost,$dbuser,$dbpw,$dbname='',$pconnect=0){57 if($this->link_rw==null)58 $this->link_rw=$this->link;59 $this->link=null;60 //不产生halt错误61 $this->connect($dbhost,$dbuser,$dbpw,$dbname,$pconnect,false);62 if($this->link){63 //连接成功64 //echo "link ro sussess!
";65 $this->ro_exist=true;66 $this->link_ro=$this->link;67 if($this->cur_db){68 //如果已经选择过数据库则需要操作一次69 @mysql_select_db($this->cur_db,$this->link_ro);70 }71 }else{72 //连接失败73 //echo "link ro failed!
";74 $this->link=&$this->link_rw;75 }76 }77 //设置一系列只读数据库并且连接其中一个78 functionset_ro_list($ro_list){79 if(is_array($ro_list)){80 //随机选择其中一个81 $link_ro=$ro_list[array_rand($ro_list)];82 $this->connect_ro($link_ro['dbhost'],$link_ro['dbuser'],$link_ro['dbpw']);83 }84 }85 functionselect_db($dbname) {86 //同时操作两个数据库连接87 $this->cur_db=$dbname;88 if($this->ro_exist){89 @mysql_select_db($dbname,$this->link_ro);90 }91 return@mysql_select_db($dbname,$this->link_rw);92 }93 functionfetch_array($query,$result_type=MYSQL_ASSOC) {94 returnmysql_fetch_array($query,$result_type);95 }96 functionfetch_one_array($sql,$type='') {97 $qr=$this->query($sql,$type);98 return$this->fetch_array($qr);99 }100 functionquery($sql,$type='') {101 $this->link=&$this->link_rw;102 //判断是否select语句103 if($this->ro_exist&&preg_match("/^(\s*)select/i",$sql)){104 $this->link=&$this->link_ro;105 }106 $func=$type=='UNBUFFERED'&&@function_exists('mysql_unbuffered_query')?107 'mysql_unbuffered_query':'mysql_query';108 if(!($query=$func($sql,$this->link))&&$type!='SILENT') {109 $this->halt('MySQL Query Error',$sql);110 }111 $this->querynum++;112 return$query;113 }114 functionaffected_rows() {115 returnmysql_affected_rows($this->link);116 }117 functionerror() {118 return(($this->link)?mysql_error($this->link):mysql_error());119 }120 functionerrno() {121 returnintval(($this->link)?mysql_errno($this->link):mysql_errno());122 }123 functionresult($query,$row) {124 $query=@mysql_result($query,$row);125 return$query;126 }127 functionnum_rows($query) {128 $query=mysql_num_rows($query);129 return$query;130 }131 functionnum_fields($query) {132 returnmysql_num_fields($query);133 }134 functionfree_result($query) {135 returnmysql_free_result($query);136 }137 functioninsert_id() {138 return($id=mysql_insert_id($this->link))>=0?$id:$this->result($this->query("SELECT last_insert_id()"),0);139 }140 functionfetch_row($query) {141 $query=mysql_fetch_row($query);142 return$query;143 }144 functionfetch_fields($query) {145 returnmysql_fetch_field($query);146 }147 functionversion() {148 returnmysql_get_server_info($this->link);149 }150 functionclose() {151 returnmysql_close($this->link);152 }153 functionhalt($message='',$sql='') {154 $dberror=$this->error();155 $dberrno=$this->errno();156 echo"

157 MySQLError
158 Message:$message
159 SQL:$sql
160 Error:$dberror
161 Errno.:$dberrno
162
";163 exit();164 }165 }166 ?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值