<?php
header("Content-Type:text/html; charset=utf8");
/**
* MySQL读写分离类的实现
* $db_config = array(
* 'master' => array('host'=>'localhost:3306','user'=>'admin','passwd'=>'123456','db'=>'stat'),
* 'slave' => array(
* array('host'=>'localhost:3307','user'=>'admin','passwd'=>'123456','db'=>'stat'),
* array('host'=>'localhost:3308','user'=>'admin','passwd'=>'123456','db'=>'stat')
* )
* );
*
* 注释:如果slave有多个时随机连接其中的一个
*/
$db_config = array(
'master' => array('host'=>'localhost:3306','user'=>'admin','passwd'=>'123456','db'=>'stat'),
'slave' => array(
array('host'=>'localhost:3307','user'=>'admin','passwd'=>'123456','db'=>'stat'),
array('host'=>'localhost:3308','user'=>'admin','passwd'=>'123456','db'=>'stat')
)
);
$db = MySQL::getInstance('','r-w');
$sql ="SELECT call_id,caller,callee,call_time,call_money,`date`,media_money,record_money FROM `success_bill` WHERE user_id='1' AND `date` BETWEEN 1427081035 AND 1427089577 LIMIT 0,15 ";
$start_time = microtime(true);
$rs = $db->query($sql);
while ($row = $db->fetch($rs)){
echo "".$row['call_id']." ".$row['caller']." ".$row['callee']." ".$row['call_time']." ".$row['call_money']." ".$row['date']." ".$row['media_money']." ".$row['record_money']."
";
}
// var_dump($db->get($rs)) ;
$end_time = microtime(true);
echo "总耗时 ", (($end_time - $start_time)*1000), " MS\n";
echo "峰值内存 ", round(memory_get_peak_usage()/1000), " KB\n";
echo "<hr />";
class MySQL
{
private static $_instance = null;//数据库连接实例
private static $_master = null;//主数据库连接实例
private static $_slave = null;//重数据库连接实例
public $_config = array();//数据库连接配置信息
public $_res = null;//查询实例句柄
public $_flag = '';//标识当前语句是在主还是从数据库上执行
public $_link = null;
/**
* 单实例
* Enter description here ...
* @param unknown_type $dbname
* @param unknown_type $mode
*/
public static function & getInstance($dbname='',$mode='rw'){
if (is_null(self::$_instance)){
self::$_instance = new self();
self::$_instance->__getConf();
self::$_instance->connect($dbname,$mode);
}
return self::$_instance;
}
/**
* 获取数据库配置信息
* Enter description here ...
*/
public function __getConf(){
global $db_config;
$this->_config['master'] = $db_config['master'];
$this->_config['slave'] = $db_config['slave'];
}
/**
* 数据库连接
* Enter description here ...
* @param $dbname 指定连接的数据库名,默认情况下连接配置文件的库
* @param $mode rw表示连接主库,r-w表示读写分离
*/
public function connect($dbname='',$mode = 'rw'){
if($mode == 'rw'){
if(is_null(self::$_master)){
$this->_master = $this->_slave = $this->conn_master($dbname);
}
}else{
if(is_null(self::$_master)){
$this->_master = $this->conn_master($dbname);
}
if(is_null(self::$_slave)){
$this->_slave = $this->conn_slave($dbname);
}
}
}
/**
* 连接到主数据库服务器
* Enter description here ...
*/
public function conn_master($dbname=''){
$_link = mysql_connect($this->_config['master']['host'],$this->_config['master']['user'],$this->_config['master']['passwd'],true) or die ("Connect ".$this->_config['master']['host']." fail.");
mysql_select_db(empty($dbname)?$this->_config['master']['db']:$dbname,$_link) or die(" The DB name ".$this->_config['master']['db']." is not exists.");
mysql_query("set names utf8",$_link);
return $_link;
}
/**
* 连接到从数据库服务器
* Enter description here ...
*/
public function conn_slave($dbname=''){
$offset = rand(0,count($this->_config['slave'])-1);
$_link = @mysql_connect($this->_config['slave'][$offset]['host'],$this->_config['slave'][$offset]['user'],$this->_config['slave'][$offset]['passwd'],true) or die(" Connect ".$this->_config['slave'][$offset]['host']." fail.");
mysql_select_db(empty($dbname)?$this->_config['slave'][$offset]['db']:$dbname,$_link) or die(" The DB name ".$this->_config['slave'][$offset]['db']." is not exists.");
mysql_query("set names utf8",$_link);
return $_link;
}
/**
* 执行数据库查询
* Enter description here ...
* @param string $sql
*/
public function query($sql,$master=true){
if($master == true || (substr(strtolower($sql),0,6) != 'select') && $master == false){
$this->_res = mysql_query($sql,$this->_master);
if(!$this->_res){
$this->_error[] = mysql_error($this->_master);
}
$this->_flag = 'master';
$this->_link = $this->_master;
} else {
$this->_res = mysql_query($sql,$this->_slave);
if(!$this->_res){
$this->_error[] = mysql_error($this->_slave);
}
$this->_flag = 'slave';
$this->_link = $this->_slave;
}
return $this->_res;
}
/**
* 获取单行记录
* Enter description here ...
* @param mixed $rs
*/
public function get($rs=''){
if(empty($rs)){
$rs = $this->_res;
}
return mysql_fetch_row($rs);
}
/**
* 获取多行记录
* Enter description here ...
* @param mixed $rs
* @param $result_type
*/
public function fetch($rs = ''){
if(empty($rs)){
$rs = $this->_res;
}
return mysql_fetch_array($rs,MYSQL_ASSOC);
}
/**
* 插入数据
* Enter description here ...
* @param unknown_type $sql
*/
public function add($sql){
$rs = $this->query($sql);
if($rs)
return mysql_insert_id($this->_link);
return false;
}
/**
* 更新数据
* Enter description here ...
* @param unknown_type $sql
*/
public function update($sql){
if(empty($sql)) return false;
$rs = $this->query($sql);
if($rs)
return $this->fetchNum();
return false;
}
/**
* 获取上一条语句影响的行数
* Enter description here ...
*/
public function fetchNum(){
return mysql_affected_rows($this->_link);
}
/**
* 析构函数,释放数据库连接资源
* Enter description here ...
*/
public function __destruct(){
mysql_close($this->_link);
}
}
分享到:
相关推荐
本文实例讲述了PHP实现的mysql读写分离操作。分享给大家供大家参考,具体如下: 首先mysql主从需配置好,基本原理就是判断sql语句是否是select,是的话走master库,否则从slave查 <?php /** * mysql读写分离 */ ...
相对于其他方法实现MySQL的读写分离来说,采用Thinkphp框架实现MySQL的读写分离简单易用,其配置文件示例代码如下: 'DB_TYPE'=> 'mysql', 'DB_DEPLOY_TYPE' => 1, //开打支持多服务器 'DB_RW_SEPARATE'=>true,//...
本篇文章是对使用PHP实现Mysql读写分离的方法进行了详细的分析介绍,需要的朋友参考下
基于此,我们再实现简单的PHP+Mysql读写分离,从而提高数据库的负载能力。 2、代码实战 <?php class Db { private $res; function __construct($sql) { $querystr = strtolower(trim(substr($sql,0,6))); ...
thinkphp核心类Thinkphp/library/Model.class.php 中,query 方法,调用Thinkphp/library/Think/Db/Driver/Mysql.class.php /** * SQL查询 * @access public * @param string $sql SQL * @
C E CCIC宋青见在2017PHP全球开发者大会上做了主题为《云原生的 MySQL 托管服务架构及读写分离的优化(PHP)》的演讲,就云原生的Azure RDS for MySQL托管服务架构,读写分离的优化,微服务架构Service Fabric的介绍做...
主要介绍了php实现带读写分离功能的MySQL类,具有针对mysql数据库的基本增删改查及读写分离操作的功能,涉及针对读库与写库的判断及操作技巧,需要的朋友可以参考下
mysql-proxy实现读写分离 MySQL Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测、分析或改变它们的通信。它使用灵活,没有限制,常见的用途包括:负载平衡,故障、查询分析,查询过滤和...
本文实例分析了Yii实现MySQL多数据库和读写分离的方法。分享给大家供大家参考。具体分析如下: Yii Framework是一个基于组件、用于开发大型 Web 应用的高性能 PHP 框架。Yii提供了今日Web 2.0应用开发所需要的几乎...
技术文档分享。
完整版 MySQL8.0从入门到精通 MySQL数据库教程 第20章 读写分离的利器-MySQL Proxy(共8页).ppt 完整版 MySQL8.0从入门到精通 MySQL数据库教程 第21章 精通MySQL存储引擎(共31页).ppt 完整版 MySQL8.0从入门到...
完整版 MySQL8.0从入门到精通 MySQL数据库教程 第20章 读写分离的利器-MySQL Proxy(共8页).ppt 完整版 MySQL8.0从入门到精通 MySQL数据库教程 第21章 精通MySQL存储引擎(共31页).ppt 完整版 MySQL8.0从入门到...
本文实例讲述了php实现的mysqldb读写分离操作类。分享给大家供大家参考,具体如下: /** * php MysqlDB 读写分离类 * ----------------------------------------------------- * $Source: ...
◆支持mysql,mongodb等第三方数据库模块,支持读写分离,分布式部署; ◆增加后台管理开发示例; ◆增加thrift模块,多线程支持hadoop HDFS海量存储组件 ◆修正thrift传输编码问题、优化传输速度 ◆增加...
第十一部 MySQL读写分离开发实现及软件实现-物理备份-高可用(已经包含有5节视频+文档资料) 01-amoeba读写分离实现技术分享.avi 02-mysql-proxy读写分离实现技术分享.avi 03-PHP程序实现读写分离技术分享.avi 04-...
完整版 MySQL8.0从入门到精通 MySQL数据库教程 第20章 读写分离的利器-MySQL Proxy(共8页).ppt 完整版 MySQL8.0从入门到精通 MySQL数据库教程 第21章 精通MySQL存储引擎(共31页).ppt 完整版 MySQL8.0从入门到...