多memcached 和 mysql 主从 环境下PHP开发: 代码详解

时间:2009-10-16     作者:smarteng     分类: 架构


<?php

$memcached = array(  //用memcached 的 多 进程模拟 多台memcached 服务器   
 cn     en   为  内存服务器名

     'cn'=>array('192.168.254.144',11211),

     'en'=>array('192.168.254.144',11212)

     );

$mysql    = array( // mysql 的主从 我的环境是 : xp 主    linux 从  mysql 5  php5

     'master'=>array('192.168.254.213','root','1','mydz'),

     'slave_1'=>array('192.168.254.144','root','1','mydz')  //可以灵活添加多台从服务器

     );

?>

[break]
复制代码服务器配置文件: 十分方便的 切换主从.  当主换了  从可以迅速切换为主.  支持 多从服务器   . <?php

class Memcached

{

private $mem;

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

private function memConnect($serkey){

  require 'config.php';

  $server = $memcached;

  $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);

}

}

?>

复制代码简单的封装了 memcached  的操作.

在memcached 的多服务器上.  我的实现思路是这样的:   在把信息添加到 内存服务器的时候.我选择了手工设置添加到那个服务器.而不用传统的根据ID自动分配.
这样可以更灵活点. 

以内存服务器名 为表示   比如 存  $arr 这个信息到  en 这台 内存服务器 我就这样写   $mem->set('en_'.$arr);    明白了吧 <?php

class Mysql

{

private   $mysqlmaster;

private   $myssqlslave;

private static $auid=0;

public function __construct(){

  require 'config.php';

  $msg = $mysql;

 

  $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){

  session_start();

  $_SESSION['SID']!=0 || $_SESSION['SID']=0   ;

  if($_SESSION['SID'] >=count($mysql)-1) $_SESSION['SID'] = 1;

  else $_SESSION['SID']++;

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

  echo($_SESSION['SID']);

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

}

 

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

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

   return false;

  }

}

 

public function squery($sql){

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

   return $result;

  }else{

   return false;

  };

}

public function fetArray($sql){

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

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

    $resultraa[] = $row;

   };

   return $resultraa;

  }

}

}

?>

复制代码这个是 mysqli 的封装.  也就是   读  从  写 主  的操作的封装. <?php

require 'init.php';

$mem = new Memcached;

/* $mem->set('en_xx','bucuo');

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

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

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

*/

$sq = new Mysql;

$sql = "insert into mybb(pid) values(200)";

$mdsql = md5($sql);

if(!$result=$mem->get('cn_'.$mdsql)){

  $sq->mquery("insert into mybb(pid) values(200)"); //插入到主mysql

  $result = $sq->fetArray("select * from mybb"); //查询 是 从mysql

  foreach($result as $var){

   echo $var['pid'];

  }

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

}else{

  foreach($result as $var){

   echo $var['pid'];

  }

}

?>