<?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. Elasticsearch-6.7.0系列(七)SpringCloud连接ES集群,使用ES用户名密码

    pom.xml代码: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://ww ...

  2. 牛客挑战赛33 B-鸽天的放鸽序列

    也许更好的阅读体验 \(\mathcal{Description}\) 定义一个长为\(n\)的\(01\)序列\(A_1, A_2, \dots, A_n\)​的权值为\(\sum_{i=1}^n ...

  3. Java Web 深入分析(11) JVM(1)

    前言 Java启动后作为一个进程运行在操作系统中,该进程要分配的内存有以下几个: 1.Java堆: 存储java内存区域,堆大小是在jvm启动时就像操作系统申请完成,其中 -Xmx和-Xms 分别表示 ...

  4. sshpass非交互式连接

    $ sshpass -p $passwd ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $USER@$IP 'echo ...

  5. Jenkins 构建方式有几种

    jenkins三种部署方式: 一.jenkins触发式构建:用于开发环境部署,开发人员push代码或者合并代码到gitlab项目的master分支,jenkins就部署代码到对应服务器. 二.jenk ...

  6. vue使用vuex大体结构

    store1.js const state = {} const mutations = {} const actions = {} const getters = {} export default ...

  7. day53-python之会话

    from django.shortcuts import render,redirect # Create your views here. import datetime def login(req ...

  8. Tomcat启动时一闪而过,看不多错误信息解决方案

    转自:https://wangxh89.iteye.com/blog/1824806 有时Tomcat的启动窗口一闪而过,根本就看不出启动过程中发生了什么错误.这中间的原因有好多种,最常见的解决办法就 ...

  9. Jmeter学习笔记(九)——响应断言

    Jmeter中又一个元件叫断言,用于检查测试中得到的响应数据等是否符合预期.断言又13种,目前在使用过程中使用到的是响应断言. 有时候请求成功了并不代表测试通过,还要看影响返回的内容是否符合预期的结果 ...

  10. 笔谈OpenGL ES(一)

    现在图形类.视频类app越来越多,学习OpenGL ES是很有必要的,作为程序员是有必要做技术积累的.现在做播放器开发的工作,正好也涉及这块,那就好好学一学. CSDN上有套教程不错,OpenGL E ...