本代码是从uchome的代码修改的,是因为要解决uchome的效率而处理的。

这个思维其实很久就有了,只是一直没有去做,相信也有人有同样的想法,如果有类似的,那真的希望提出相关的建议。

封装的方式比较简单,增加了只读数据库连接的接口扩展,不使用只读数据库也不影响原代码使用。

有待以后不断完善。。

希望给有需要的朋友带来帮助。

PHP实现的Mysql读写分离

主要特性:

简单的读写分离

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

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

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

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

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

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

*** 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!
";

$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!
";

$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 "

MySQL Error

Message: $message

SQL: $sql

Error: $dberror

Errno.: $dberrno

";

exit();

}

}

?>

example.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];

}

?>

转自http://www.blueidea.com/tech/program/2009/6636.asp

php 连接 mysql主从_php 连接主从数据库相关推荐

  1. vb 通过php连接mysql数据库连接_PHP连接MySQL数据库的几种方法

    1.最简单的方式-mysql(面向过程) $con = mysql_connect("localhost","root","password" ...

  2. vb 通过php连接mysql数据库连接_php连接mysql数据库

    步骤 连接数据库 $link = mysqli_connect('localhost','root','123456'); 判断/返回连接状态 if(!$link){ echo "不儿,tm ...

  3. li连接mysql代码_php连接mysql基本代码-测试代码

    我们现在来介绍一下php连接mysql最基本的操作. 我想学习PHP的同学,估计没有不认识mysql,而用php来操作mysql首先要做的就是连接好mysql我们现在就来说一下,如何用php来连接my ...

  4. php连接mysql地址_PHP连接mysql

    PHP 5 及以上版本建议使用以下方式连接 MySQL : MySQLi extension ("i" 意为 improved) PDO (PHP Data Objects) 在 ...

  5. mysql useunicode_jdbc连接mysql 为什么在连接时已经这样设置了 ?useUnicode=truecharacterEncodin...

    jdbc连接mysql 为什么在连接时已经这样设置了 ?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&m ...

  6. mysql怎么可视化连接_IDEA连接MySQL可视化工具连接操作

    IDEA连接MySQL可视化工具连接操作入下所示: 填写完成后,点击测试连接,连接成功如图所示点击OK即可 报告错误(如图所示):[08001] Could not create connection ...

  7. CentOS使用docker部署mysql5.7、可使用navicat连接mysql服务,以及主从同步配置

    查找待拉取的镜像 mysql镜像地址:https://hub.docker.com/_/mysql?tab=tags 我使用的是5.3.37的版本:docker pull mysql:5.7.37 d ...

  8. PHP与MySQL连接菜鸟教程_PHP 连接 MySQL 数据库 | w3cschool菜鸟教程

    PHP 连接 MySQL 数据库 使用 PHP mysqli_connect() 函数连接到一个 MySQL 数据库. 连接到一个 MySQL 数据库 在我们访问数据库中的数据之前,我们必须创建一个到 ...

  9. PHP与MySQL连接菜鸟教程_PHP 连接 MySQL - PHP 教程 - 菜鸟学堂-脚本之家

    PHP 连接 MySQL PHP 5 及以上版本建议使用以下方式连接 MySQL : MySQLi extension ("i" 意为 improved) PDO (PHP Dat ...

最新文章

  1. error_reporting()
  2. 高效使用Google
  3. 01-UIContainerView纯代码实现及原理介绍
  4. 一文详解PolarDB披荆斩棘的“秘密武器”
  5. Iterator图解
  6. 推流和拉流的概念以及RTMP和HLS协议
  7. Makeflie自动生成依赖,自动化编译
  8. cocos2dx阴影层的实现
  9. 基于taskctl实现kettle任务调度
  10. DayDayUp:计算机技术与软件专业技术资格证书之《系统集成项目管理工程师》课程讲解之十大知识领域之4核心—项目质量管理
  11. DOS命令和linux
  12. 好看的字体:华康流风体
  13. m计算机代表什么意思,计算器上的m+是什么意思
  14. 1.4418不锈钢规范及使用环境详解
  15. 怎样设置默认打印机(HttpPrinter 易桥打印中间件)
  16. OneTab和BdTab的标签管理对比
  17. 大数据安全相关概念(上)
  18. 什么是业务中台、数据中台、技术中台?这回终于解释清楚了
  19. 高中数学必修3知识点总结归纳:第一章算法初步
  20. 用PDF格式协议的方式给PDF文档添加透明文字水印

热门文章

  1. Chrome开发者工具network标签页里的transferred over network和resources loaded by the page的区别
  2. 在SAP云平台测试帐号中启用Kyma运行环境
  3. package javax.servlet.jsp.tagext does not exist的错误消息如何解决
  4. 如何创建URL Mashup并插入到SAP Cloud for Customer标准页面里
  5. How is SAP CDS metadata retrieved from GM6 frontend - text related
  6. hybris backoffice 产品属性和sample data的对应关系
  7. how is my appointment opened in HCP
  8. 使用IntelliJ, 让lombok生效的方式
  9. How to bind multiple properties with formatter on one control
  10. 通过kubeless命令行部署Kyma Lambda Function