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

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
分享到:
评论

相关推荐

    YII2数据库MySQL复制和读写分离配置

    MySQL数据库复制和读写分离是数据库管理中的重要概念和实践,可以有效提升数据库的扩展性和可用性。特别是在高流量的Web应用中,读写分离可以减轻主服务器的压力,提高应用的性能。YII2是一个基于组件的高性能PHP...

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

    1. `DB_TYPE` 设置为 `'mysql'` 表示使用MySQL数据库。 2. `DB_DEPLOY_TYPE` 设置为 `1` 表示启用分布式部署,支持多服务器,这是读写分离的前提。 3. `DB_RW_SEPARATE` 设置为 `true` 表示开启读写分离,Thinkphp会...

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

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

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

    本文将深入剖析在ThinkPHP框架下实现MySQL数据库读写分离的代码逻辑。 首先,理解读写分离的基本概念:读写分离是将数据库的读操作和写操作分配到不同的数据库服务器上,通常主数据库处理写操作,而从数据库处理读...

    Laravel数据库读写分离配置的方法

    在Laravel中,数据库读写分离的配置是通过修改配置文件`config/database.php`来实现的。通过这个配置文件,我们可以指定主数据库(写操作)和从数据库(读操作)的连接信息,包括主机地址、用户名、密码以及其它连接...

    安装LAP+mysql主从库 apache+mysql+proxy主从+PHP+discuz论坛 .docx

    1. LAMP企业架构读写分离:LAMP架构是指Linux操作系统、Apache Web服务器、MySQL数据库和PHP编程语言的结合,读写分离是指将数据库的读写操作分离到不同的服务器,以提高数据库的性能和可用性。 2. MYSQL读写分离...

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

    在本示例中,我们将探讨如何使用PHP实现MySQL数据库的读写分离。 首先,了解读写分离的基本概念:在高并发场景下,读操作通常远多于写操作。将读操作分散到多个从库(slaves)上,可以减轻主库(master)的压力,...

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

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

    PHP操作mysql数据库分表的方法_.docx

    对于读多写少的场景,可以采用读写分离、主从复制等手段进一步提升性能。同时,分表后可能需要设计更复杂的查询逻辑,比如联合查询或使用中间表,以确保数据的一致性。 总的来说,PHP操作MySQL数据库进行分表是解决...

    LAMP+Proxy+读写分离

    为了解决MySQL数据库的压力,企业通常会采用读写分离的技术。读写分离的核心思想是将数据库的读操作和写操作分开,主数据库(Master)负责处理所有的写操作,如CREATE、INSERT、UPDATE和DELETE,而从数据库(Slave)...

    MySQL 5.7从入门到精通 第22章 PHP操作MySQL数据库 共7页.pptx

    【课程大纲】 第1章 初始MySQL 共19页.pptx 第2章 MySQL的安装与配置 共14页.pptx ...第22章 PHP操作MySQL数据库 共7页.pptx 第23章 新闻发布系统数据库设计 共6页.pptx 第24章 论坛管理系统数据库设计 共6页.pptx

    php MySQL 网络数据库指南(3)

    13. 数据库扩展性:随着网站规模的增长,理解如何设计可扩展的数据库架构,包括分区、分片和读写分离等高级主题。 通过《PHP MySQL 网络数据库指南(3)》,您将全面掌握使用PHP与MySQL进行数据库开发的基本技能,并...

    MySQL 5.7从入门到精通 第21章 读写分离的利器——MySQL Proxy 共5页.pptx

    【课程大纲】 第1章 初始MySQL 共19页.pptx 第2章 MySQL的安装与配置 共14页.pptx ...第22章 PHP操作MySQL数据库 共7页.pptx 第23章 新闻发布系统数据库设计 共6页.pptx 第24章 论坛管理系统数据库设计 共6页.pptx

    如何在ASP中使用mySQL数据库.pdf

    在上述代码示例中,`imgcounter.asp`是一个与页面分离的图像计数器,它利用数组存储每个数字对应的图像URL,并通过读写文本文件实现计数。这个例子展示了ASP如何处理文件系统和动态生成HTML内容。 需要注意的是,...

Global site tag (gtag.js) - Google Analytics