mysql_affect_array_Mysql代理类 支持Master/Slave 读写分离
/**
* 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 读写分离相关推荐
- 数据库应用——Atlas代理MySQL集群实现读写分离
Atlas代理MySQL集群实现读写分离 一.Atlas简介和架构 1.1 环境准备 1.2 配置时间服务器 二.主服务器配置 2.1 master节点1的配置 2.2 master节点2的配置 2. ...
- mysql-proxy代理加mysql主从实现读写分离
实验环境搭建: mysql-proxy 192.168.1.163 mysql-master 192.168.1.164 (主) mysql-slave 192.168.1.162 (从) ...
- php redis 读写分离类,yii实现redis读写分离
/** * FileName:RedisCluster * 配置说明 * 配置为1主多从 或者 1个独立的服务器 * 写往主的里面写 * 读是从从的里面读 * 'class'=>'RedisCa ...
- SpringBoot下MySQL的读写分离
首页 博客 专栏·视频 下载 论坛 问答 代码 直播 能力认证 高校 会员中心 收藏 动态 消息 创作中心 02-下篇-SpringBoot下MySQL的读写分离 dusuanyun 2018-07- ...
- mysql主从以及读写分离(科普)
2019独角兽企业重金招聘Python工程师标准>>> 在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的.无论是在安全性.高可用性还是高并发等各个方 ...
- amoeba for mysql配置_Amoeba for mysql 读写分离
Amoeba(变形虫)项目 http://docs.hexnova.com/amoeba/ ,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件.这个软件致力于MySQL的分布 ...
- 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. 中继日志问题 ...
- mysql主从和mycat读写分离的安装及验证
目录 一.背景介绍 二.安装mysql数据库(主从机器都需要先这样安装) 三.主从机配置 1.主服务器进行如下操作 2.从服务器进行如下操作 四.代理服务器安装和配置mycat读写分离 五.主从复制. ...
- Linux下配置mycat实现MySQL读写分离
一.什么是MyCat MyCAT是一款由阿里Cobar演变而来的用于支持数据库,读写分离.分表分库的分布式中间件.MyCAT支持Oracle.MSSQL.MYSQL.PG.DB2关系型数据库,同时也支 ...
最新文章
- RabbitMQ安装与初始配置【转载】
- Qt网络编程——使用OpenCV与TCP搭建图像处理服务器
- 2022年美国大学生数学建模竞赛——Problem E:林业固碳
- armgcc交叉编译的文件无法运行_[阿里巴巴(校招/社招)] 虚拟机与编译器团队招人啦~ (JVM / GCC / LLVM 方向)...
- (转载)RESTORE DATABASE命令还原SQLServer 2005 数据库
- UE4_下载源码并编译
- React-注册事件
- 计算机能力考试合格证(5个模块),全国专业技术人员计算机应用能力考试
- 在Mac下,快速搭建针对WP8应用的PhoneGap开发环境
- 大牛书单 | C++ 好书推荐
- Ubuntu中禁用触摸板
- Zabbix自动发现和自动注册
- ubuntu14.04下推荐的工具及插件
- python中日期格式转换,计算单位天数时间差
- Linux 中用 dd 命令来测试硬盘读写速度
- DMOZ重新接受登录申请(转)
- 兼容NSR20F30NXT5G的小体积肖特基二极管
- 【NVM】node多个版本管理工具安装步骤以及使用
- 程序员兼职私活的网站
- MATLAB:批量对图片进行裁剪