`
sxysxy
  • 浏览: 216673 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
4点了.今天是最后一天在这间公司.心情不是很好.

所以写下东西发泄下. 一般的大站通常做法是 拿着内存当数据库来用(memcached). 和很好的读写分离备份机制 (mysql 的主从)

在这样的环境下我们怎么进行PHP开发呢.本人不太会讲话.所以还是帖代码吧.

刚在linux的 VIM里写的一个demo 调试通过.也同时希望大家拍砖 ,使用PHP5写的. PHP4写出来怕大家说我落后了
复制PHP内容到剪贴板
PHP代码:

<?php
$memcached
=array(//用memcached的多进程模拟多台memcached服务器cnen为内存服务器名
'cn'=>array('192.168.254.144',11211),
'en'=>array('192.168.254.144',11212)
);
$mysql=array(//mysql的主从我的环境是:xp主linux从mysql5php5
'master'=>array('192.168.254.213','root','1','mydz'),
'slave_1'=>array('192.168.254.144','root','1','mydz')//可以灵活添加多台从服务器
);
?>

服务器配置文件: 十分方便的 切换主从.当主换了从可以迅速切换为主.支持 多从服务器 .
复制PHP内容到剪贴板
PHP代码:

<?php
classMemcached
{
private
$mem;
public
$pflag='';//memcachedpconnecttag
privatefunctionmemConnect($serkey){
require
'config.php';
$server=$memcached;
$this->mem=newMemcache;
$link=!$this->pflag?'connect':'pconnect';
$this->mem->$link($server[$serkey][0],$server[$serkey][1])or$this->errordie('memcachedconnecterror');

}

publicfunction
set($ser_key,$values,$flag='',$expire=''){
$this->memConnect($this->tag($ser_key));
if(
$this->mem->set($ser_key,$values,$flag,$expire))returntrue;
elsereturn
false;
}

publicfunction
get($ser_key){
$this->memConnect($this->tag($ser_key));
if(
$var=$this->mem->get($ser_key))return$var;
elsereturn
false;
}
privatefunction
tag($ser_key){
$tag=explode('_',$ser_key);
return
$tag[0];
}
privatefunction
errordie($errmsg){
die(
$errmsg);
}
}
?>

简单的封装了 memcached的操作. 详细的时间不多.我要离开公司了

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

以内存服务器名 为表示 比如 存$arr 这个信息到en 这台 内存服务器 我就这样写 $mem->set('en_'.$arr); 明白了吧
复制PHP内容到剪贴板
PHP代码:

<?php
classMysql
{
private
$mysqlmaster;
private
$myssqlslave;
privatestatic
$auid=0;
publicfunction
__construct(){
require
'config.php';
$msg=$mysql;

$this->mysqlmaster=newmysqli($msg['master'][0],$msg['master'][1],$msg['master'][2],$msg['master'][3]);//mastermysql
$this->mysqlslave=$this->autotranscat($msg);//slavemysql

if(mysqli_connect_errno()){
printf("Connectfailed:%s/n",mysqli_connect_error());
exit();
}
if(!
$this->mysqlmaster->set_charset("latin1")&&!$this->mysqlslave->set_charset("latin1")){
exit(
"setcharseterror");
}
}

privatefunction
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']);
returnnew
mysqli($mysql[$key][0],$mysql[$key][1],$mysql[$key][2],$mysql[$key][3]);
}

publicfunction
mquery($sql){//insertupdate
if(!$this->mysqlmaster->query($sql)){
return
false;
}
}

publicfunction
squery($sql){
if(
$result=$this->mysqlslave->query($sql)){
return
$result;
}else{
return
false;
};
}
publicfunction
fetArray($sql){
if(
$result=$this->squery($sql)){
while(
$row=$result->fetch_array(MYSQLI_ASSOC)){
$resultraa[]=$row;
};
return
$resultraa;
}
}
}
?>

这个是 mysqli 的封装.也就是 读从写 主的操作的封装.
复制PHP内容到剪贴板
PHP代码:

<?php
require'init.php';
$mem=newMemcached;
/*$mem->set('en_xx','bucuo');
echo($mem->get('en_xx'));
$mem->set('cn_jjyy','wokao');
echo($mem->get('cn_jjyy'));
*/
$sq=newMysql;
$sql="insertintomybb(pid)values(200)";
$mdsql=md5($sql);
if(!
$result=$mem->get('cn_'.$mdsql)){
$sq->mquery("insertintomybb(pid)values(200)");//插入到主mysql
$result=$sq->fetArray("select*frommybb");//查询是从mysql
foreach($resultas$var){
echo
$var['pid'];
}
$mem->set('cn_'.$mdsql,$result);//添加到名为cn的memcached服务器
}else{
foreach(
$resultas$var){
echo
$var['pid'];
}
}
?>

这个是使用程序. 看下就大概明白了.
大站就差不多是这样实现的了. 这种帖似乎只有我发了. 献丑了
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics