/*


index.php   程序入口,用来构造sql(如查询,更新)


config.php  配置参数(memcache,mysql)


init.php    封装memcached操作(memcache连接,设置,获取)


mysqli.php  封闭mysql操作(mysql主连接,mysql从连接,mysql主更新,mysql从查询)


*/

index.php


<?php


require 'init.php';              //加载init.php


$mem = new Memcached;            //建立memcached对象,对象为$mem


/*


$mem->set('en_xx','bucuo',0,30); //测试连接memcached,用来调试很不错。


echo($mem->get('en_xx'));


$mem->set('cn_jjyy','wokao',0,30);


echo($mem->get('cn_jjyy'));


*/

require 'mysqli.php';


$sq = new Mysql;    


//下面这两个sql是人为构造的,这也可以做成一个接口                


$sql = "Select * from traffic";                   


//$sql = "insert into traffic(id,acct_mth,amount) values(14,14,46)";


//进行判断,如果sql语句中有头有select(不区分大小写)


if(preg_match ("/^select/i", $sql)){


    $mdsql = md5($sql);


    if(!$result=$mem->get('cn_'.$mdsql)){      //这里选择的是cn memcached,大家也可以根据需求在前面做个条件来将数据存取放入到另一个memcached中。


           $result = $sq->fetArray($sql); //查询是 从mysql


           foreach($result as $var){


                echo $var['amount'];


            }


           $mem->set('cn_'.$mdsql,$result,0,600); //添加到 名为cn的memcached 服务器


    }else{


            foreach($result as $var){


                echo $var['amount']."<br>";


          }


    }


}else{


    $sq->mquery($sql);     //更新是 主mysql


}

?>

config.php


<?php


$memcached = array( 


     'cn'=>array('192.168.x.y',11211),


     'en'=>array('192.168.y.x',11211)


     );


$mysql    = array( 


     'master'=>array('x','root','','test'),


     'slave_1'=>array('y','root','','test'), 


     'slave_2'=>array('z','root','','test') //可以灵活添加多台从服务器


     );


?>

init.php


<?php


class Memcached


{


private $mem;


public $pflag=''; // memcached pconnect tag


    private function memConnect($serkey){     //建立memcached连接,这些都很容易理解


                require 'config.php';


                $server = $memcached;  //$memcached是cn,en的数组


                $this->mem = new Memcache;  


                $link = !$this->pflag ? 'connect' : 'pconnect' ;


                $this->mem->$link($server[$serkey][0],$server[$serkey][1]) or $this->errordie('memcached connect error');


      }

public function set($ser_key,$values,$flag='',$expire=''){  //设置获取数据


               $this->memConnect($this->tag($ser_key));


                if($this->mem->set($ser_key,$values,$flag,$expire)) return true;


                else return false;


      }

public function get($ser_key){


               $this->memConnect($this->tag($ser_key));


               if($var=$this->mem->get($ser_key)) return $var;


               else return false;


      }


    private function tag($ser_key){


               $tag=explode('_',$ser_key);


               return $tag[0];


      }


    private function errordie($errmsg){


                die($errmsg);


      }


/*  这段函数是我用来在类中做调试用的。


    public function show($messages){


               echo $messages;


    }


*/


}


?>

mysqli.php


<?php


class Mysql


{


/* 这段函数是我用来调试的


public function show($messages){


               var_dump($messages);


    }


*/


private   $mysqlmaster;


private   $myssqlslave;

public function __construct(){   //构造函数


         require 'config.php';


         $msg = $mysql;          //$mysql是master,slave_1,slave_2


         $this->mysqlmaster = new mysqli($msg['master'][0],$msg['master'][1],$msg['master'][2],$msg['master'][3]); //master mysql


         $this->mysqlslave = $this->autotranscat($msg); // slave mysql

if(mysqli_connect_errno()){


                     printf("Connect failed: %s\n",mysqli_connect_error());


                      exit();


          }


        if(!$this->mysqlmaster->set_charset("latin1") && !$this->mysqlslave->set_charset("latin1")){


                    exit("set charset error");


          }


}


private function autotranscat($mysql){        //这段函数的作用是获取从服务器序列号,如1,2


        session_start();                      //启动会话


       $_SESSION['SID']!=0 || $_SESSION['SID']=0;  //如果不为0,就不做赋值操作(那第一次访问的话,肯定会做赋值操作的)


        if($_SESSION['SID'] >=count($mysql)-1) $_SESSION['SID'] = 1;  //上面那个动作是为这个动作准备的


        else $_SESSION['SID']++;


        $key = 'slave_'.$_SESSION['SID'];


        return new mysqli($mysql[$key][0],$mysql[$key][1],$mysql[$key][2],$mysql[$key][3]);


}

public function mquery($sql){ //mysql主 insert update


if(!$this->mysqlmaster->query($sql)){


   return false;


}


}

public function squery($sql){   //mysql从 查询


if($result=$this->mysqlslave->query($sql)){


   return $result;


}else{


   return false;


};


}


public function fetArray($sql){  //mysql从 查询 入口


if($result=$this->squery($sql)){


   while($row=$result->fetch_array(MYSQLI_ASSOC)){


    $resultraa[] = $row;


   };


   return $resultraa;


}


}


}


?>

php memcached+Mysql(主从)的更多相关文章

  1. memcached+Mysql(主从)

    昨天和守住看了下http://hi.baidu.com/156544632/blog/item/3b26527b68623ff00bd18746.html这篇文章,思路很好,但感觉就是太乱了,而且还出 ...

  2. LVS+Keepalived+Squid+Nginx+MySQL主从高性能集群架构部署方案

    方案一,在tomcat的workers.properties里面配置相关条件 worker.tomcat.lbfactor= worker.tomcat.cachesize= worker.tomca ...

  3. Mysql主从配置,实现读写分离

    大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...

  4. mysql主从数据库

    Mysql主从配置,实现读写分离 大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库 ...

  5. mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理

    转自:http://www.cnblogs.com/kevingrace/p/6261091.html 在mysql工作中接触最多的就是mysql replication mysql在复制方面还是会有 ...

  6. 黄聪:Mysql主从配置,实现读写分离

    大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...

  7. mysql主从配置,读写分离

    Mysql主从配置,实现读写分离 大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库 ...

  8. 配置mysql主从数据库

    来源地址:https://www.cnblogs.com/alvin_xp/p/4162249.html Mysql主从配置,实现读写分离 大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡 ...

  9. Mysql主从分离介绍及实现

    参考: http://www.cnblogs.com/panxuejun/p/5887118.html https://www.cnblogs.com/alvin_xp/p/4162249.html ...

随机推荐

  1. C语言库函数大全及应用实例七

    原文:C语言库函数大全及应用实例七 [编程资料]C语言库函数大全及应用实例七 函数名: getw 功 能: 从流中取一整数 用 法: int getw(FILE *strem); 程序例: #i nc ...

  2. final、finally、finalize差异

    final.finally.finalize差异 1.final修饰符 它代表了一类是完美的类,它不能被继承,因此.一个类不能既被标记为final类别.同一时间被标记为abstract. 将变量或者函 ...

  3. 一步一步写算法(之n!中末尾零的个数统计)

    原文:一步一步写算法(之n!中末尾零的个数统计) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在很多面试的题目中,求n!结果中零的个数也是 ...

  4. jQuery多文件

    jQuery多文件下载 文件下载是一个Web中非常常用的功能,不过你是做内部管理系统还是做面向公众的互联网公司都会遇到这个问题,对于下载一般有点实际开发经验的都会自己解决,上周弄了一下多文件下载,业务 ...

  5. 如何运行代码apk安装

    import java.io.File; import android.app.Activity; import android.content.Intent; import android.net. ...

  6. 为Pythonic论坛添加一个“专题”功能

    代码还没读完就踏上了修改功能的深坑.还好思路清晰,通过修改模板和视图,实现了专题模块 原论坛的模式是用户点击节点发帖,然后就归到节点的分类里面了.我需要一个功能,就是右侧需要一个专题区,管理员发帖的话 ...

  7. SQL点滴21—几个有点偏的语句

    原文:SQL点滴21-几个有点偏的语句 SQL语句是一种集合操作,就是批量操作,它的速度要比其他的语言快,所以在设计的时候很多的逻辑都会放在sql语句或者存储过程中来实现,这个是一种设计思想.但是今天 ...

  8. 解决IIS7 HTTP/405 Method Not Allowed 问题的方法.

    1.处理程序映射 2.添加脚本映射 3.请求路径:*.html 4.可执行文件:C:/windows/system32/inetsrv/asp.dll 5.请求限制-谓词:输入需要允许请求的谓词(po ...

  9. [置顶] Android开发之Thread类分析

    在我们Linux系统中创建线程函数为:pthread_create(),在Android中我们为线程封装了一个类Thread,实际调用的还是pthread_create() 当我们想创建线程的时候,只 ...

  10. .NET MVC4 实训记录之四(Unit of work + Repository)

    今日后开启进阶模式! 谈到MVC与EntityFramework,则不得不说一说事务与仓储(Unit of work + Repository). 仓储(Repository):领域对象集合.用于操作 ...