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 ftp文件上传函数(基础版)
Jun 03 PHP
PHP中实现汉字转区位码应用源码实例解析
Jun 14 PHP
浅析php中常量,变量的作用域和生存周期
Aug 10 PHP
php+js实现图片的上传、裁剪、预览、提交示例
Aug 27 PHP
php中smarty区域循环的方法
Jun 11 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
Dec 28 PHP
PHP计算近1年的所有月份
Mar 13 PHP
thinkPHP框架中执行原生SQL语句的方法
Oct 25 PHP
php提取微信账单的有效信息
Oct 01 PHP
PHP正则匹配到2个字符串之间的内容方法
Dec 24 PHP
PHP常用header头定义代码示例汇总
Aug 29 PHP
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
Apr 11 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 文件状态缓存带来的问题
2008/12/14 PHP
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
2011/08/12 PHP
基于php在各种web服务器的运行模式详解
2013/06/03 PHP
PHP中使用php://input处理相同name值的表单数据
2015/02/03 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
Mootools 1.2教程 排序类和方法简介
2009/09/15 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
EsLint入门学习教程
2017/02/17 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
2017/02/28 Javascript
vue打包后显示空白正确处理方法
2017/11/01 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
2018/12/13 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
python基础教程之循环介绍
2014/08/29 Python
Python装饰器decorator用法实例
2014/11/10 Python
Python httplib模块使用实例
2015/04/11 Python
使用Kivy将python程序打包为apk文件
2017/07/29 Python
深入理解Python中range和xrange的区别
2017/11/26 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
Python3+Appium安装使用教程
2019/07/05 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
Python实现AES加密,解密的两种方法
2020/10/03 Python
英国太阳镜品牌:Taylor Morris Eyewear
2018/04/18 全球购物
表达自我的市场:Society6
2018/08/01 全球购物
计算机求职自荐信范文
2014/04/19 职场文书
乡镇干部个人对照检查材料(群众路线)
2014/09/26 职场文书
恰同学少年观后感
2015/06/08 职场文书
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS