php mysql读写分离

标签: php mysql 分离 | 发表时间:2015-03-26 15:13 | 作者:Demon_311
出处:http://www.iteye.com
 

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


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [php mysql 分离] 推荐:

php mysql读写分离

- - 开源软件 - ITeye博客

CentOS 6下搭建Apache+MySQL+PHP+SSL

- 〤依然特雷西 - 博客园-首页原创精华区
网上的一些文章都已经比较老了,现在版本高了之后,其实配置是很省力的(不考虑什么负载的话). 分享全过程,出了文中提到的安装epel rpmfushion 源指令不同外,其他的过程也适用与Centos 5. 1.安装CentOS 6 ,可以选择最小安装,也可以安装桌面. 3.安装mysql,并设置mysql开机自启动,同时启动mysql.

PHP最佳实践:MySQL的连接

- - IT技术博客大学习
标签:   MySQL连接. 从PHP 5.5版本开始, mysql函数将被官方废弃,即所有 mysql_* 格式函数 将在5.5版本后当产生一个. E_DEPRECATED 错误. 废弃mysql函数的主要原因为:此函数为 的MySQL  3.23版本开发的,而目前的MySQL版本已经到了 5.6,中间产生了非常多的特性没有被函数所支持.

mysql 数据分离

- - 数据库 - ITeye博客
网上看到一个读写分离的帖子,感觉不错. 构建高性能web之路------mysql读写分离实战(转). 一个完整的mysql读写分离环境包括以下几个部分:. 在本次实战中,应用程序client基于c3p0连接后端的database proxy. database proxy负责管理client实际访问database的路由策略,采用开源框架amoeba.

mysql读写分离

- - 企业架构 - ITeye博客
使用mysql主从复制的好处有:  . 1、采用主从服务器这种架构,稳定性得以提升. 如果主服务器发生故障,我们可以使用从服务器来提供服务. 2、在主从服务器上分开处理用户的请求,可以提升数据处理效率. 3、将主服务器上的数据复制到从服务器上,保护数据免受意外的损失. 新企业要搭建架构为主从复制的mysql数据库.

PHP查询MySQL大量数据的内存占用分析

- Avenger - OurMySQL
这篇文章主要是从原理, 手册和源码分析在PHP中查询MySQL返回大量结果时, 内存占用的问题, 同时对使用MySQL C API也有涉及.. 昨天, 有同事在PHP讨论群里提到, 他做的一个项目由于MySQL查询返回的结果太多(达10万条), 从而导致PHP内存不够用. 所以, 他问, 在执行下面的代码遍历返回的MySQL结果之前, 数据是否已经在内存中了.

PHP+MySQL环境下SQL Injection攻防总结

- rokeyhu - 老王的技术手册 ( 我的新博客:http://huoding.com )
程序员们写代码的时候讲究TDD(测试驱动开发):在实现一个功能前,会先写一个测试用例,然后再编写代码使之运行通过. 其实当黑客SQL Injection时,同样是一个TDD的过程:他们会先尝试着让程序报错,然后一点一点的修正参数内容,当程序再次运行成功之时,注入也就随之成功了. 假设你的程序里有类似下面内容的脚本:.

php+mysql+memcache实战型技术测试(答案公布)

- 逆风迎上 - caoz的和谐blog
出两个变态的题目,题目很变态,但是都是实战中遇到的真实案例,. 1:我写一个程序,既要使用mysql也要使用memcache,. 第一行是 mysql_connect,第二行是memcache_connect. 换过来写,第一行是memcache_connect,第二行是mysql_connect.

centos 下 编译安装 nginx + mysql + php 服务

- - CSDN博客系统运维推荐文章
1.6、创建nginx启动脚本. 1.7、修改nginx配置文件. 2.2、创建mysql用户. 2.4、解压安装mysql. #执行三条语句 解决 /bin/rm: cannot remove `libtoolT': No such file or directory. 2.5、修改配置文件并启动数据库.

Windows下Apache+PHP+MySQL简易配置教程

- - 蓝飞技术部落格
首先自然是下载软件,然后该解压的解压(注意要非中文目录,这里的软件目录以均以 C:\Program Files为例),该安装的安装(MySQL的安装会有许多选项,英文好的看着按自己需要勾勾填填就行了,实在不行的参考 这里,这里的版本比较旧,不过配置选项大致还是差不多的). Apache: httpd-2.4.3-win32.zip( 更多版本).