`
hudeyong926
  • 浏览: 2016108 次
  • 来自: 武汉
社区版块
存档分类
最新评论

PHP mysql数据库读写分离

阅读更多
MYSQL的读写分离实现有2种思路
  1. MySQL中间件
  2. 用算法实现


 算法实现原理:先用正则判断是读操作,就轮询连接slave库,如果是写操作就轮询连接master库。

public function isReadOperation($sql) {
    return preg_match('/^\s*(SELECT|SHOW|DESC|PRAGMA)\s+/i',$sql);
}

随机选择mysql主库或者从库算法:不能保证负载均衡

<?php
$count = count($slave_ips) - 1;
$index = mt_rand(0, $count);
return $slave_ips[$index];

 

php读写分离类

<?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();
	}
}

?>

 调用方法

<?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];
}
?>
  • 大小: 69 KB
分享到:
评论

相关推荐

    Thinkphp实现MySQL读写分离操作示例

    相对于其他方法实现MySQL的读写分离来说,采用Thinkphp框架实现MySQL的读写分离简单易用,其配置文件示例代码如下: 'DB_TYPE'=&gt; 'mysql', 'DB_DEPLOY_TYPE' =&gt; 1, //开打支持多服务器 'DB_RW_SEPARATE'=&gt;true,//...

    thinkphp下MySQL数据库读写分离代码剖析

    thinkphp核心类Thinkphp/library/Model.class.php 中,query 方法,调用Thinkphp/library/Think/Db/Driver/Mysql.class.php /** * SQL查询 * @access public * @param string $sql SQL * @

    完整版 MySQL8.0从入门到精通 MySQL数据库教程 全套PPT课件资源集合 共26个章节 含全部源代码.rar

    完整版 MySQL8.0从入门到精通 MySQL数据库教程 第20章 读写分离的利器-MySQL Proxy(共8页).ppt 完整版 MySQL8.0从入门到精通 MySQL数据库教程 第21章 精通MySQL存储引擎(共31页).ppt 完整版 MySQL8.0从入门到...

    完整版 MySQL8.0从入门到精通 MySQL数据库教程 第11章 视图(共20页).ppt

    完整版 MySQL8.0从入门到精通 MySQL数据库教程 第20章 读写分离的利器-MySQL Proxy(共8页).ppt 完整版 MySQL8.0从入门到精通 MySQL数据库教程 第21章 精通MySQL存储引擎(共31页).ppt 完整版 MySQL8.0从入门到...

    完整版 MySQL8.0从入门到精通 MySQL数据库教程 第23章 PDO数据库抽象类库(共12页).ppt

    完整版 MySQL8.0从入门到精通 MySQL数据库教程 第20章 读写分离的利器-MySQL Proxy(共8页).ppt 完整版 MySQL8.0从入门到精通 MySQL数据库教程 第21章 精通MySQL存储引擎(共31页).ppt 完整版 MySQL8.0从入门到...

    PHP实现的mysql读写分离操作示例

    本文实例讲述了PHP实现的mysql读写分离操作。分享给大家供大家参考,具体如下: 首先mysql主从需配置好,基本原理就是判断sql语句是否是select,是的话走master库,否则从slave查 &lt;?php /** * mysql读写分离 */ ...

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

    基于此,我们再实现简单的PHP+Mysql读写分离,从而提高数据库的负载能力。 2、代码实战 &lt;?php class Db { private $res; function __construct($sql) { $querystr = strtolower(trim(substr($sql,0,6))); ...

    Yii实现MySQL多数据库和读写分离实例分析

    本文实例分析了Yii实现MySQL多数据库和读写分离的方法。分享给大家供大家参考。具体分析如下: Yii Framework是一个基于组件、用于开发大型 Web 应用的高性能 PHP 框架。Yii提供了今日Web 2.0应用开发所需要的几乎...

    基于 MySQL 协议,Swoole 开发的MySQL数据库连接池.zip

    支持读写分离 支持数据库连接池,能够有效解决 PHP 带来的数据库连接瓶颈 支持 SQL92 标准 采用协程调度 支持多个数据库连接,多个数据库,多个用户,灵活搭配 遵守 MySQL 原生协议,跨语言,跨平台的通用中间件代理...

    使用PHP实现Mysql读写分离

    本代码是从uchome的代码修改的,是因为要解决uchome的效率而...PHP实现的Mysql读写分离主要特性:1.简单的读写分离 2.一个主数据库,可以添加更多的只读数据库 3.读写分离但不用担心某些特性不支持 4.缺点:同时连接

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    05-mysql数据库读写分离介绍及企业生产实现方案.avi 06-根据企业业务拆分业务应用到不同的从库思想.avi 07-mysql主从复制原理画图深入浅出讲解.avi 08-mysql主从复制实战01.avi 09-mysql主从复制实战02.avi 10-主从...

    php实现带读写分离功能的MySQL类完整实例

    主要介绍了php实现带读写分离功能的MySQL类,具有针对mysql数据库的基本增删改查及读写分离操作的功能,涉及针对读库与写库的判断及操作技巧,需要的朋友可以参考下

    swoolemsyqlproxy一个基于mysql协议swoole开发的mysql数据库连接池

    支持读写分离 支持数据库连接池,能够有效解决PHP带来的数据库连接瓶颈 支持SQL92标准 遵守Mysql原生协议,跨语言,跨平台的通用中间件代理。 支持多个数据库连接,多个数据库,多个用户,灵活搭配。 支持mysql...

    yii2 数据库读写分离配置示例

    开始使用数据库首先需要配置数据库连接组件,通过添加 db 组件到应用配置实现(”基础的” Web 应用是 config/web.PHP),DSN( Data Source Name )是数据源名称,用于指定数据库信息.如下所示: return [ // ... ...

    MySQL的使用中实现读写分离的教程

    MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。...

    MySQL8从入门到精通视频.zip

    网盘文件永久链接 ...第22讲 PHP操作mysql数据库 第23讲 PDO数据库抽象类库 第24讲 开发网上商城 第25讲 论坛管理系统数据库设计 第26讲 新闻发布系统数据库设计 课本幻灯片 课本源代码 MySQL常用命令大全

    iWebShop开源php电子商务软件v5.5.190303

    iWebShop可以轻松满足用户量级百万至千万级的大型电子商务网站的性能要求,良好的框架设计模式和严谨的代码规范让用户在高安全性的购物平台下获得绝佳的购物体验,程序伸缩能力强,支持数据库读写分离和主从支持!...

    Difeye-敏捷的轻量级PHP框架 v1.1.5.zip

    ◆支持mysql,mongodb等第三方数据库模块,支持读写分离,分布式部署; ◆增加后台管理开发示例; ◆增加thrift模块,多线程支持hadoop HDFS海量存储组件 ◆修正thrift传输编码问题、优化传输速度 ◆增加...

Global site tag (gtag.js) - Google Analytics