memcached 和 mysql 主从环境下php开发代码详解


Posted in PHP onMay 16, 2010
<?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') //可以灵活添加多台从服务器 
); 
?>

服务器配置文件: 十分方便的 切换主从. 当主换了 从可以迅速切换为主. 支持 多从服务器 .
<?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); 明白了吧
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 的封装. 也就是 读 从 写 主 的操作的封装.
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']; 
} 
} 
?>
PHP 相关文章推荐
一个简单实现多条件查询的例子
Oct 09 PHP
Zend 输出产生XML解析错误
Mar 03 PHP
php防攻击代码升级版
Dec 29 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
Jun 17 PHP
PHP实现加密的几种方式介绍
Feb 22 PHP
PHP中字符安全过滤函数使用小结
Feb 25 PHP
PHP MVC框架skymvc支持多文件上传
May 26 PHP
php简单压缩css样式示例
Sep 22 PHP
详解如何在云服务器上部署Laravel
Jun 30 PHP
php中curl和soap方式请求服务超时问题的解决
Jun 11 PHP
PHP PDOStatement::fetchObject讲解
Feb 01 PHP
PHP get_html_translation_table()函数用法讲解
Feb 16 PHP
php 中文和编码判断代码
May 16 #PHP
PHP URL地址获取函数代码(端口等) 推荐
May 15 #PHP
php select,radio和checkbox默认选择的实现方法
May 15 #PHP
php checkbox复选框值的获取与checkbox默认值输出方法
May 15 #PHP
php radio 单选框获取与保持值的实现代码
May 15 #PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
May 15 #PHP
php gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
May 15 #PHP
You might like
php ob_flush,flush在ie中缓冲无效的解决方法
2010/05/09 PHP
PHP 透明水印生成代码
2012/08/27 PHP
PHP生成唯一订单号
2015/07/05 PHP
php计算税后工资的方法
2015/07/28 PHP
Joomla语言翻译类Jtext用法分析
2016/05/05 PHP
文本链接逐个出现的js脚本
2007/12/12 Javascript
表单元素事件 (Form Element Events)
2009/07/17 Javascript
jQuery live( type, fn ) 委派事件实现
2009/10/11 Javascript
js apply/call/caller/callee/bind使用方法与区别分析
2009/10/28 Javascript
jquery.ui.draggable中文文档
2009/11/24 Javascript
jquery的$(document).ready()和onload的加载顺序
2010/05/26 Javascript
Mac地址验证的javascript代码
2013/11/09 Javascript
JSON中双引号的轮回使用过程中一定要小心
2014/03/05 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
Javascript 是你的高阶函数(高级应用)
2015/06/15 Javascript
JavaScript测试工具之Karma-Jasmine的安装和使用详解
2015/12/03 Javascript
浅析BootStrap模态框的使用(经典)
2016/04/29 Javascript
浅谈angularjs依赖服务注入写法的注意点
2017/04/24 Javascript
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
基于vue-ssr服务端渲染入门详解
2018/01/08 Javascript
JS引用传递与值传递的区别与用法分析
2018/06/01 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
2020/02/14 Javascript
Python 学习笔记
2008/12/27 Python
对于Python中线程问题的简单讲解
2015/04/03 Python
Fabric 应用案例
2016/08/28 Python
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
基于python元祖与字典与集合的粗浅认识
2017/08/23 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
Ray-Ban雷朋太阳眼镜英国官网:Ray-Ban UK
2019/11/23 全球购物
.net工程师笔试题
2012/06/09 面试题
兼职学生的自我评价
2013/11/24 职场文书
品质主管的岗位职责
2013/12/04 职场文书
前台文员岗位职责
2015/02/04 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
漫画「古见同学有交流障碍症」第25卷封面公开
2022/03/21 日漫
MySQL数据库查询进阶之多表查询详解
2022/04/08 MySQL