<?php

 class MemcacheController extends ControllerBase
{
public function indexAction()
{
session_start();
$sessid = session_id(); $server = array(
array('localhost',11200),
array('localhost',11201),
array('localhost',11202),
);
$memCache = new Memcached('conn_pool');
$curt_server = $this->connectMemcache($sessid,$memCache,$server);
echo "<br><br>目前连接的服务器:".json_encode($curt_server);
if(!empty($curt_server)){
//设置60秒过期
$issetm = $memCache->set("user",$sessid,3600);
if($issetm)
{
echo "<br>设置memcached user成功!";
}
}
}
public function getAction(){
session_start();
$sessid = session_id();
$server = array(
array('localhost',11200),
array('localhost',11201),
array('localhost',11202),
);
$memCache = new Memcached('conn_pool');
$curt_server = $this->connectMemcache($sessid,$memCache,$server);
echo "<br><br>目前连接的服务器:".json_encode($curt_server);
$user_sid = $memCache->get("user");
echo "sessionid=【{$sessid}】 获取memcached数据:".$user_sid;
echo "<br>";
//根据当前sessid 和 取出的 user的数据比较;不相同重新登录
if($sessid != $user_sid){
echo "////////重新登录///////";
$issetm = $memCache->set("user",$sessid,3600);
if($issetm)
{
echo "<br>设置sessionid memcached user成功!";
}
}
}
private function connectMemcache( $sessid , $memCache , $server= array()){
$server_num = count($server); //获取[memcached]服务器
$laststr = substr($sessid, -1);
$curr_idx = $this->bcd2char(strtolower($laststr)) % $server_num;
$host = $server[$curr_idx][0];
$port = $server[$curr_idx][1];
$serv = $host . ':' . $port; //预期连接的台服务器[对应: $sessid]
echo "<br><br><br>------------------开始连接第【{$curr_idx}】台server主机={$host} 端口={$port} 预期连接的地址:{$serv}----------------<br/>";
$serv_arr = $memCache->getServerList();
$list_cnt = count($serv_arr);
echo "当前活动的Memcached 总数:{$list_cnt}个 活动的 服务IP是:".json_encode($serv_arr)."<br>";
if($list_cnt>0){
//如果存在;判断状态
$stat_arr = $memCache->getStats();
//获取获取服务器池中所有活动的服务器
$stat_ver = $memCache->getVersion();
if($stat_arr){
foreach ($stat_arr as $keyhost => $stat){
if ($stat['pid'] > 0) { //如果存在活动的;判断服务器的进程(pid >0)时, 表示该服务器正常!
if ($keyhost == $serv) {
//如果访问ip与预期的ip相同返回当前ip
echo "已经找到该活动进程ID={$stat['pid']}服务器 版本:".json_encode($stat_ver)."<br>";
return $server[$curr_idx];
}
}
}
}
}
//如果为匹配ip;则清除服务器列表中的所有服务器;重新添加
$resetmem = $memCache->resetServerList();
if($resetmem){
echo "+++++++++++++++清除服务器列表中的所有服务器;开始重新添加服务器列表Success.+++++++++++++++ <br/>";
}else{
echo "+++++++++++++++清除服务器列表中的所有服务器Faild+++++++++++++++.<br/>";
}
//重新连接
if ($memCache->addServer($host, $port)) { /* 短连接模式 */
echo "重新添加服务器第【{$curr_idx}】台server主机={$host} 端口={$port}<br/>";
//如果存在;判断状态
$stat_arr = $memCache->getStats();
//获取获取服务器池中所有服务器的版本信息
$stat_ver = $memCache->getVersion();
if($stat_arr){
echo "<b><font color=green>重新添加服务器成功;服务器版本:".json_encode($stat_ver)."</font></b><br>";
return $server[$curr_idx];
}else{
echo "=================================添加状态失败 server主机={$host} 端口={$port}=================================<br>";
//删去失败的[memcached]配置
$temp = $server[$curr_idx];
unset($server[$curr_idx]);
$resetmem = $memCache->resetServerList();//还原服务器列表
if(count($server)>0 && $resetmem){
sort($server);
echo "<b><font color=red>【开始删除】连接失败的服务器:{$temp[0]}:{$temp[1]} *****重试其他的服务列表:".json_encode($server)."</font><b><br>";
return $this->connectMemcache($sessid , $memCache , $server);
}else{
echo "No valid memcached servers!";
return false;
}
}
}
}
/*
* BCD到字符码
* @param $char 字符码到BCD
* @return 字符码
*/
private function bcd2char($char)
{
$bcd = ord($char);
if ($bcd >= 97 && $bcd <= 102) {
//'a'..'f'
return $bcd - 87;
} else {
//'0'..'9'
return $bcd - 48;
}
} }

目标主机:localhost:11200 | localhost:11201 | localhost:11202

根据user客户端的sessionid 来定位使用哪台服务器;如果其中一台挂掉;则;循环添加其他的memcache;直到添加成功返回;连接的当前主机IP;

运行结果:

PHP中使用 Memcached 的测试案例的更多相关文章

  1. 有关memcached企业面试案例讲解

    有关memcached企业面试案例讲解 1.Memcached是什么,有什么作用?    a. memcached是一个开源的.高性能的内存的缓存软件,从名称上看Mem就是内存的意思,而Cache就是 ...

  2. 在Windows中安装Memcached

    Memcached是一个高并发的内存键值对缓存系统,它的主要作用是将数据库查询结果,内容,以及其它一些耗时的计算结果缓存到系统内存中,从而加速Web应用程序的响应速度. Memcached最开始是作为 ...

  3. Storm自带测试案例的运行

    之前Storm安装之后,也知道了Storm的一些相关概念,那么怎么样才可以运行一个例子对Storm流式计算有一个感性的认识呢,那么下面来运行一个Storm安装目录自带的测试案例,我们的Storm安装在 ...

  4. Discuz!NT中集成Memcached分布式缓存

    大约在两年前我写过一篇关于Discuz!NT缓存架构的文章,在那篇文章的结尾介绍了在IIS中如果开启多个应用程序池会造成多个缓存实例之间数据同步的问题.虽然给出了一个解决方案,但无形中却把压力转移到了 ...

  5. 在Azure中使用Load Runner测试TCP最大并发连接数

    对于Azure中的每一台虚机,它所能支持的TCP最大并发连接数是50万(参考微软官网: http://azure.microsoft.com/en-us/documentation/articles/ ...

  6. 编写优美的GTest测试案例

    http://www.cnblogs.com/coderzh/archive/2010/01/09/beautiful-testcase.html 使用gtest也有很长一段时间了,这期间也积累了一些 ...

  7. nginx整合tomcat集群并做session共享----测试案例

    最近出于好奇心,研究了一下tomcat集群配置,并整合nginx,实现负载均衡,session共享,写篇记录,防止遗忘.---------菜鸡的自我修炼. 说明:博主采用一个web项目同时部署到两台t ...

  8. 第九章 MySQL中LIMIT和NOT IN案例

    第九章 MySQL中LIMIT和NOT IN案例 一.案例的项目 1.创建数据库语句: #创建数据库 CREATE DATABASE `schoolDB`; USE `schoolDB`; #创建学生 ...

  9. robotframework+selenium搭配chrome浏览器,web测试案例(搭建篇)

    这两天发布版本 做的事情有点多,都没有时间努力学习了,先给自己个差评,今天折腾了一天, 把robotframework 和 selenium 还有appnium 都研究了一下 ,大概有个谱,先说说we ...

随机推荐

  1. enum类型的标签内容根据语言的取法

    昨天做了一个开发,说要取enum里面英文label 例如  JournalType   枚举值有   transfer\profit/loss 但是在中文的AX系统时会显示“转移\盈亏”, 但是客户又 ...

  2. idea之常见问题解决

    在启动类中的main方式时报类似java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest异常 解决方案:

  3. Windows中的消息与消息队列

    消息 在Windows中,消自由MSG结构体表示 typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lPar ...

  4. nginx-rtmp之直播视频流的推送

    一.RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写.该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变 ...

  5. 试用一款网荐的 iOS 快速布局UI库

      NerdyUI github: https://github.com/nerdycat/NerdyUI Cupcake (Swift 版本) github: https://github.com/ ...

  6. linux时间格式

    date "+%Y-%m-%d %H:%M:%S" 2019-10-27 12:02:33

  7. python 执行系统命令模块比较

    python 执行系统命令模块比较 1.os.system模块 仅仅在子终端运行命令,返回状态码,0为成功,其他为失败,但是不返回执行结果 如果再命令行下执行,结果直接打印出来 >>> ...

  8. GCC使用总结

    概念 GCC一开始是linux系统集成的用来编译C程序的编译器(GNU C Compiler),目前GCC已经不仅仅支持C语言了,因而其缩写名单意义也变成(GNU Compiler Collectio ...

  9. 2013.5.3 - KDD第十五天

    今天上午把昨天的想法给中秋发过去了,然后我就开始科普随机森林: 随机森林是一种比较新的机器学习模型.经典的机器学习模型是神经网络,有半个多世纪的历史了.神经网络预测精确,但是计算量很大.上世纪八十年代 ...

  10. Spark-2.3.2 HBase BulkLoad

    在大量数据需要写入HBase时,通常有Put方式和BulkLoad两种方式. Put不做解释. BulkLoader方式的优势在于: 1.不会触发WAL预写日志,当表还没有数据时进行数据导入不会产生F ...