<?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. CharacterEncodingFilter cannot be cast to javax.servlet.Filter

    java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast ...

  2. 方法1:使用Jenkins构建Docker镜像 --SpringCloud

    前提意义: SpringCloud微服务里包含多个文件夹,拉取仓库的所有代码,然后过根据选项参数使用maven编译打包指定目录的jar,然后再根据这个目录的Dockerfile文件制作Docker镜像 ...

  3. idea常用插件安装

    1.IDEA Restart IDEA没有重启的选项,这个工具就是来弥补这个功能,可以在File-->Restart 重启,也可以使用快捷键  CTRL + ALT + R 2.Maven He ...

  4. Ado.Net查询语句使用临时表做条件

    using System; using System.Data; using System.Data.SqlClient; using System.Text; namespace WindowsFo ...

  5. NEST explain

    Elasticsearch 的相似度算法 被定义为检索词频率/反向文档频率, TF/IDF ,包括以下内容: 检索词频率 检索词在该字段出现的频率?出现频率越高,相关性也越高. 字段中出现过 5 次要 ...

  6. java第四次面试总结

    该公司没有笔试,直接就进行了面试,然后我就拿着我的简历瑟瑟发抖...... 1.因为是看简历来面试,所以面试官从我的项目下手,而我的项目都是后端的东西,虽然学过一些前端,但是项目里并没有用到任何jav ...

  7. 装饰器带类参数 & 一个函数应用多个装饰器

    装饰器:不改变原函数的基础上,给函数增加功能的方式,称为装饰器 即:为已经存在的对象添加额外的功能 装饰器其实就是一个闭包,把一个函数当做参数后返回一个替代版的函数 decos.py:(装饰器的参数类 ...

  8. TweenMax—ScrambleText插件 实现类似电脑破译密码的特效

    首先贴一下TweenMax的中文网:https://www.tweenmax.com.cn/ 首先先展示一下最后的效果,需要的就继续看下去: 那团乱码是会一直变的 那么如何实现上图的效果呢??? 其实 ...

  9. 在notepad++中编辑时光标消失不见

    在notepad++进行编辑时,会不知道的情况下,鼠标光标由竖线变成了下划线,如图 解决方法很简单,是点击”insert“键或者”ins“键,即可改变光标形状.

  10. tensorflow 单机多GPU训练时间比单卡更慢/没有很大时间上提升

    使用tensorflow model库里的cifar10 多gpu训练时,最后测试发现时间并没有减少,反而更慢 参考以下两个链接 https://github.com/keras-team/keras ...