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 相关文章推荐
深入理解PHP之数组(遍历顺序)  Laruence原创
Jun 13 PHP
有关于PHP中常见数据类型的汇总分享
Jan 06 PHP
php中mail函数发送邮件失败的解决方法
Dec 24 PHP
php用户注册信息验证正则表达式
Nov 12 PHP
WordPress中用于获取文章作者与分类信息的方法整理
Dec 17 PHP
PHP利用imagick生成组合缩略图
Feb 19 PHP
Symfony2函数用法实例分析
Mar 18 PHP
thinkphp隐藏index.php/home并允许访问其他模块的实现方法
Oct 13 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
Oct 13 PHP
php strftime函数获取日期时间(switch用法)
May 16 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 27 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
Mar 09 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 获取时间今天明天昨天时间戳的详解
2013/06/20 PHP
图解找出PHP配置文件php.ini的路径的方法
2014/08/20 PHP
PHP中余数、取余的妙用
2015/06/29 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
2016/03/17 PHP
php封装的mysqli类完整实例
2016/10/18 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
海量经典的jQuery插件集合
2010/01/12 Javascript
Javascript 变量作用域 两个可能会被忽略的小特性
2010/03/23 Javascript
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
JavaScript Array对象扩展indexOf()方法
2014/05/09 Javascript
百度地图api如何使用
2015/08/03 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
jQuery实现的导航下拉菜单效果示例
2016/09/05 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
TableSort.js表格排序插件使用方法详解
2017/02/10 Javascript
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
es6函数之rest参数用法实例分析
2020/04/18 Javascript
详解使用pymysql在python中对mysql的增删改查操作(综合)
2017/01/18 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
浅谈matplotlib中FigureCanvasXAgg的用法
2020/06/16 Python
基于PyTorch的permute和reshape/view的区别介绍
2020/06/18 Python
使用python编写一个语音朗读闹钟功能的示例代码
2020/07/14 Python
Python爬虫之Selenium鼠标事件的实现
2020/12/04 Python
英国高街奥特莱斯:Highstreet Outlet
2019/11/21 全球购物
介绍下Java的输入输出流
2014/01/22 面试题
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
三个Unix的命令面试题
2015/04/12 面试题
2014新年寄语
2014/01/20 职场文书
文明倡议书
2015/01/19 职场文书
幼儿教师年度个人总结
2015/02/05 职场文书
2015年组织部工作总结
2015/04/03 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
小学生暑假安全保证书
2015/07/13 职场文书
原生JS实现飞机大战小游戏
2021/06/09 Javascript
JavaScript中isPrototypeOf函数
2021/11/07 Javascript