/**

* Mysql代理类 支持Master/Slave 读写分离 客户端不需担心连Master/Slave 本类自动代理完成

*

* @author 小黑米

* @package Core.DB

* @version 1.0 beat

* @copyright 2008-5-8

* @todo 下一步准备开发支持多memcache的代理

*/

/*

配置:

$dns = array(

array(//第一个为主库

"host"=>"localhost",

"user"=>"root",

"pwd"=>"123456",

"port"=>3306,

"db"=>"phpexp",

),

//剩下的都是从库

array(

"host"=>"localhost",

"user"=>"root",

"pwd"=>"123456",

"port"=>3306,

"db"=>"phpexp",

),

);

执行方法:

Mysql::getInstance()->fetchResult("select * from frame_role");

Mysql::getInstance()->query("update frame_role set name=test limit 1");

SQL记录追踪:

array(2) {

["times"] => int(2)

["sqls"] => array(2) {

[0] => array(2) {

["sql"] => string(24) "select * from frame_role"

["type"] => string(5) "slave"

}

[1] => array(2) {

["sql"] => string(39) "update frame_role set name=test limit 1"

["type"] => string(6) "master"

}

}

}

执行结果:

array(2) {

[0] => array(4) {

["id"] => string(1) "1"

["rname"] => string(7) "tourisa"

["rmark"] => string(6) "游客"

["rprev"] => string(6) "a:0:{}"

}

[1] => array(4) {

["id"] => string(1) "2"

["rname"] => string(7) "tourise"

["rmark"] => string(7) "游客1"

["rprev"] => string(6) "a:0:{}"

}

}

*/

class Mysql{

/**

* 单例模式

*

* @var resource

*/

private static $instance = null;

/**

* Master 单例

*

* @var resource

*/

private static $master = null;

/**

* Slave 单例

*

* @var resource

*/

private static $slave = null;

/**

* 数据库执行记录

*

* @var array

*/

public static $querys = array("times"=>0,"sqls"=>array());

private $_tmpRes = null;

/**

* 获取单例

*

* @return resource

*/

public static function getInstance(){

if(!self::$instance)

{

self::$instance = new Mysql();

}

return self::$instance;

}

/**

* 构造函数 保留

*

*/

private function __construct(){}

/**

* 取记录 并根据自动hash结果集

*

* @param string $sql

* @param string $hashBy

* @return array

*/

public function fetchResult($sql,$hashBy=null){

$return = array();

$this->query($sql);

if(!$this->_tmpRes) httpError("handler500","SQL:{$sql} 执行失败");

if(!$hashBy)

{

while ($res = mysql_fetch_assoc($this->_tmpRes))

{

$return[] = $res;

}

}

else

{

while ($res = mysql_fetch_assoc($this->_tmpRes))

{

$return[$res[$hashBy]] = $res;

}

}

return $return;

}

/**

* 执行指令

*

* @param string $sql

* @return resource

*/

public function query($sql){

self::$querys['times']++;

$conn = $this->_checkSql($sql);

self::$querys['sqls'][] = array("sql"=>$sql,"type"=>$conn['type']);

// d(mysql_query($sql,$this->conn) or die(mysql_error()),false);

$this->_tmpRes = mysql_query($sql,$conn['conn']) or httpError("handler500",mysql_error());

}

/**

* 分析SQL语句,自动分配到主库,从库

*

* @param string $sql

* @return resource

*/

private function _checkSql($sql){

global $dns;

$_n = count($dns);

if(count($dns)===1)

{//主从一样

return $this->_getHelper($dns[0],"master");

}

else

{

$type = substr($sql,0,strpos($sql," "));

if ($type === 'select')

{//读从库

if($_n=2)

{

$ddns = $dns[1];

}

else

{//随即取一个从库

$ddns = $dns[mt_rand(1,$_n-1)];

}

return $this->_getHelper($ddns);

}

else

{//更新主库

return $this->_getHelper($dns[0],"master");

}

}

}

/**

* 主从库助手函数

*

* @param array $dns

* @param string $type Slave/Master

* @return resource

*/

private function _getHelper($dns,$type="slave"){

if(!self::$$type)

{

self::$$type = new Helper($dns);

}

return array("conn"=>self::$$type->getConn(),"type"=>$type);

}

/**

* 影响记录数

*

* @param string $sql

* @return array

*/

public function getAffectRows(){

return mysql_affected_rows();

}

/**

* 最后插入的ID

*

* @param string $sql

* @return array

*/

public function getLastInsertId(){

return mysql_insert_id();

}

}

class Helper{

private $conn = null;

public function __construct(&$dns){

$this->conn = mysql_connect($dns['host'].":".$dns['port'],$dns['user'],$dns['pwd']) or httpError("handler500","数据库出错");

mysql_select_db($dns['db'],$this->conn) or httpError("handler500",$dns['db']."库出现异常");

}

public function getConn(){

return $this->conn;

}

}

?>

mysql_affect_array_Mysql代理类 支持Master/Slave 读写分离相关推荐

  1. 数据库应用——Atlas代理MySQL集群实现读写分离

    Atlas代理MySQL集群实现读写分离 一.Atlas简介和架构 1.1 环境准备 1.2 配置时间服务器 二.主服务器配置 2.1 master节点1的配置 2.2 master节点2的配置 2. ...

  2. mysql-proxy代理加mysql主从实现读写分离

    实验环境搭建: mysql-proxy   192.168.1.163 mysql-master  192.168.1.164 (主) mysql-slave   192.168.1.162 (从) ...

  3. php redis 读写分离类,yii实现redis读写分离

    /** * FileName:RedisCluster * 配置说明 * 配置为1主多从 或者 1个独立的服务器 * 写往主的里面写 * 读是从从的里面读 * 'class'=>'RedisCa ...

  4. SpringBoot下MySQL的读写分离

    首页 博客 专栏·视频 下载 论坛 问答 代码 直播 能力认证 高校 会员中心 收藏 动态 消息 创作中心 02-下篇-SpringBoot下MySQL的读写分离 dusuanyun 2018-07- ...

  5. mysql主从以及读写分离(科普)

    2019独角兽企业重金招聘Python工程师标准>>> 在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的.无论是在安全性.高可用性还是高并发等各个方 ...

  6. amoeba for mysql配置_Amoeba for mysql 读写分离

    Amoeba(变形虫)项目 http://docs.hexnova.com/amoeba/ ,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件.这个软件致力于MySQL的分布 ...

  7. Linux随笔19-MySQL主从复制、Percona XtraBackup实现全量和增量备份、ProxySQL实现读写分离

    Contents 1. MySQL5.7实现主从复制 1.1 基础环境 1.2. 配置主从复制 1.2.1. master节点上的配置 1.2.2. slave节点上的配置 1.2.3. 中继日志问题 ...

  8. mysql主从和mycat读写分离的安装及验证

    目录 一.背景介绍 二.安装mysql数据库(主从机器都需要先这样安装) 三.主从机配置 1.主服务器进行如下操作 2.从服务器进行如下操作 四.代理服务器安装和配置mycat读写分离 五.主从复制. ...

  9. Linux下配置mycat实现MySQL读写分离

    一.什么是MyCat MyCAT是一款由阿里Cobar演变而来的用于支持数据库,读写分离.分表分库的分布式中间件.MyCAT支持Oracle.MSSQL.MYSQL.PG.DB2关系型数据库,同时也支 ...

最新文章

  1. RabbitMQ安装与初始配置【转载】
  2. Qt网络编程——使用OpenCV与TCP搭建图像处理服务器
  3. 2022年美国大学生数学建模竞赛——Problem E:林业固碳
  4. armgcc交叉编译的文件无法运行_[阿里巴巴(校招/社招)] 虚拟机与编译器团队招人啦~ (JVM / GCC / LLVM 方向)...
  5. (转载)RESTORE DATABASE命令还原SQLServer 2005 数据库
  6. UE4_下载源码并编译
  7. React-注册事件
  8. 计算机能力考试合格证(5个模块),全国专业技术人员计算机应用能力考试
  9. 在Mac下,快速搭建针对WP8应用的PhoneGap开发环境
  10. 大牛书单 | C++ 好书推荐
  11. Ubuntu中禁用触摸板
  12. Zabbix自动发现和自动注册
  13. ubuntu14.04下推荐的工具及插件
  14. python中日期格式转换,计算单位天数时间差
  15. Linux 中用 dd 命令来测试硬盘读写速度
  16. DMOZ重新接受登录申请(转)
  17. 兼容NSR20F30NXT5G的小体积肖特基二极管
  18. 【NVM】node多个版本管理工具安装步骤以及使用
  19. 程序员兼职私活的网站
  20. MATLAB:批量对图片进行裁剪

热门文章

  1. 小米5S刷机认真看一眼就能会的简单详细教图文
  2. 基于Idea的Spark大数据分析--scala
  3. css多种方法画四分之一圆曲线
  4. 笔记本HDMI1.4 1080p下外接高刷显示器的实现方法之一
  5. archlinux 安装xorg
  6. 微服务项目:尚融宝(38)(核心业务流程:申请借款额度(1))
  7. 一道逻辑推理题的程序实现(纯属娱乐)
  8. 这是一片求助帖——关于梆梆加固企业版的托克修复问题
  9. 阿里二面惨败,痛哭流涕狂刷 1000+ 面试题,成功面上五面上岸滴滴
  10. php中访问excel文件,PHP中常用的Excel文件访问类及修改 | 学步园