PHP教程MySQL读写分离由PHP实现
本代码是从uchome的代码修改的,是因为要解决uchome的效率而处理的。
PHP实现的Mysql读写分离
主要特性:
简单的读写分离
一个主数据库,可以添加更多的只读数据库
读写分离但不用担心某些特性不支持
缺点:同时连接两个数据库
英文比较烂,也写几个字吧
phpcodeformysqlread/writesplit
feature:
simplyrwsplit
onemaster,canaddmoreslaves
supportallmysqlfeature
linktothemasterandslaveatthesametime
PHP代码:
mysql_rw_php.class.php
/
mysql-rw-phpversion0.1@2009-4-16
codebyhqlulu#gmail.com
http://www.aslibra.com
http://code.google.com/p/mysql-rw-php/
codemodifyfromclass_mysql.php(uchome)
/
classmysql_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;
functionmysql_rw_php(){
}
functionconnect($dbhost,$dbuser,$dbpw,$dbname='''',$pconnect=0,$halt=TRUE){
if($pconnect){
if(!$this->link=@mysql_pconnect($dbhost,$dbuser,$dbpw)){
$halt&&$this->halt(''CannotconnecttoMySQLserver'');
}
}else{
if(!$this->link=@mysql_connect($dbhost,$dbuser,$dbpw)){
$halt&&$this->halt(''CannotconnecttoMySQLserver'');
}
}
//只读连接失败
if(!$this->link&&!$halt)returnfalse;
//未初始化rw时,第一个连接作为rw
if($this->link_rw==null)
$this->link_rw=$this->link;
if($this->version()>''4.1''){
if($this->charset){
@mysql_query("SETcharacter_set_connection=$this->charset,character_set_results=$this->charset,character_set_client=binary",$this->link);
}
if($this->version()>''5.0.1''){
@mysql_query("SETsql_mode=''''",$this->link);
}
}
if($dbname){
$this->select_db($dbname);
}
}
//连接一个只读的mysql数据库
functionconnect_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"linkrosussess! ";
$this->ro_exist=true;
$this->link_ro=$this->link;
if($this->cur_db){
//如果已经选择过数据库则需要操作一次
@mysql_select_db($this->cur_db,$this->link_ro);
}
}else{
//连接失败
//echo"linkrofailed! ";
$this->link=&$this->link_rw;
}
}
//设置一系列只读数据库并且连接其中一个
functionset_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'']);
}
}
functionselect_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);
}
functionfetch_array($query,$result_type=MYSQL_ASSOC){
returnmysql_fetch_array($query,$result_type);
}
functionfetch_one_array($sql,$type=''''){
$qr=$this->query($sql,$type);
return$this->fetch_array($qr);
}
functionquery($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_quewww.shanxiwang.netry'':''mysql_query'';
if(!($query=$func($sql,$this->link))&&$type!=''SILENT''){
$this->halt(''MySQLQueryError'',$sql);
}
$this->querynum++;
return$query;
}
functionaffected_rows(){
returnmysql_affected_rows($this->link);
}
functionerror(){
return(($this->link)?mysql_error($this->link):mysql_error());
}
functionerrno(){
returnintval(($this->link)?mysql_errno($this->link):mysql_errno());
}
functionresult($query,$row){
$query=@mysql_result($query,$row);
return$query;
}
functionnum_rows($query){
$query=mysql_num_rows($query);
return$query;
}
functionnum_fields($query){
returnmysql_num_fields($query);
}
functionfree_result($query){
returnmysql_free_result($query);
}
functioninsert_id(){
return($id=mysql_insert_id($this->link))>=0?$id:$this->result($this->query("SELECTlast_insert_id()"),0);
}
functionfetch_row($query){
$query=mysql_fetch_row($query);
return$query;
}
functionfetch_fields($query){
returnmysql_fetch_field($query);
}
functionversion(){
returnmysql_get_server_info($this->link);
}
functionclose(){
returnmysql_close($this->link);
}
functionhalt($message='''',$sql=''''){
$dberror=$this->error();
$dberrno=$this->errno();
echo"
MySQLError
Message:$message
SQL:$sql
Error:$dberror
Errno.:$dberrno
";
exit();
}
}
?>
example.php
/
mysql-rw-phpversion0.1@2009-4-16
codebyhqlulu#gmail.com
http://www.aslibra.com
http://code.google.com/p/mysql-rw-php/
codemodifyfromclass_mysql.php(uchome)
/
require_once(''mysql_rw_php.class.php'');
//rwinfo
$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=newmysql_rw_php;
//connectMaster
$DB->connect($db_rw[dbhost],$db_rw[dbuser],$db_rw[dbpw],$db_rw[dbname]);
//Method1:connectoneserver
$DB->connect_ro($db_ro[0][dbhost],$db_ro[0][dbuser],$db_ro[0][dbpw]);
//Method2:connectoneserverfromalistbyrand
$DB->set_ro_list($db_ro);
//sendtorw
$sql="insertintoaseta=''test''";
$DB->query($sql);
//sendtoro
$sql="selectfroma";
$qr=$DB->query($sql);
while($row=$DB->fetch_array($qr)){
echo$row[a];
}
?>
|
|