PHP中使用 Memcached 的测试案例
<?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 的测试案例的更多相关文章
- 有关memcached企业面试案例讲解
有关memcached企业面试案例讲解 1.Memcached是什么,有什么作用? a. memcached是一个开源的.高性能的内存的缓存软件,从名称上看Mem就是内存的意思,而Cache就是 ...
- 在Windows中安装Memcached
Memcached是一个高并发的内存键值对缓存系统,它的主要作用是将数据库查询结果,内容,以及其它一些耗时的计算结果缓存到系统内存中,从而加速Web应用程序的响应速度. Memcached最开始是作为 ...
- Storm自带测试案例的运行
之前Storm安装之后,也知道了Storm的一些相关概念,那么怎么样才可以运行一个例子对Storm流式计算有一个感性的认识呢,那么下面来运行一个Storm安装目录自带的测试案例,我们的Storm安装在 ...
- Discuz!NT中集成Memcached分布式缓存
大约在两年前我写过一篇关于Discuz!NT缓存架构的文章,在那篇文章的结尾介绍了在IIS中如果开启多个应用程序池会造成多个缓存实例之间数据同步的问题.虽然给出了一个解决方案,但无形中却把压力转移到了 ...
- 在Azure中使用Load Runner测试TCP最大并发连接数
对于Azure中的每一台虚机,它所能支持的TCP最大并发连接数是50万(参考微软官网: http://azure.microsoft.com/en-us/documentation/articles/ ...
- 编写优美的GTest测试案例
http://www.cnblogs.com/coderzh/archive/2010/01/09/beautiful-testcase.html 使用gtest也有很长一段时间了,这期间也积累了一些 ...
- nginx整合tomcat集群并做session共享----测试案例
最近出于好奇心,研究了一下tomcat集群配置,并整合nginx,实现负载均衡,session共享,写篇记录,防止遗忘.---------菜鸡的自我修炼. 说明:博主采用一个web项目同时部署到两台t ...
- 第九章 MySQL中LIMIT和NOT IN案例
第九章 MySQL中LIMIT和NOT IN案例 一.案例的项目 1.创建数据库语句: #创建数据库 CREATE DATABASE `schoolDB`; USE `schoolDB`; #创建学生 ...
- robotframework+selenium搭配chrome浏览器,web测试案例(搭建篇)
这两天发布版本 做的事情有点多,都没有时间努力学习了,先给自己个差评,今天折腾了一天, 把robotframework 和 selenium 还有appnium 都研究了一下 ,大概有个谱,先说说we ...
随机推荐
- Junit5中实现参数化测试
从Junit5开始,对参数化测试支持进行了大幅度的改进和提升.下面我们就一起来详细看看Junit5参数化测试的方法. 部署和依赖 和Junit4相比,Junit5框架更多在向测试平台演进.其核心组成也 ...
- [高清] SpringBoot揭秘快速构建微服务体系
------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...
- win7远程服务器发生身份验证错误,要求的函数不受支持
远程服务器发生身份验证错误,要求的函数不受支持,远程登录服务器以前都是正常的,今天登录远程桌面就一直是这样的错误.记录一下解决方法. 方法一:卸载补丁KB41037181.打开控制面板,找到“程序和功 ...
- charles4.0 request和response的显示设置
点击右上角的设置按钮 点击preferences 切换到viewers,取消勾选Combine request and response,点击保存即可
- 让table中的td不会被过长的文字撑开,并且自动出现省略号
<style type="text/css"> table {width:600px;table-layout:fixed;} td {white-space:nowr ...
- MySQL数据库连接报错
数据库版本8.x和其他版本配置有区别: 1. 驱动依赖和连接 报错: Could not create connection to database server - java mysql conne ...
- RabbitMQ-python应用
介绍 官方文档:https://www.rabbitmq.com/tutorials/tutorial-one-python.html RabbitMQ是一个基于AMQP协议的消息代理.它的工作就是接 ...
- 小程序canvas绘制倒计时
如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ 如果解决不了,可以在文末进群交流. 效果展示: //广告倒计时 advTimeCountDown:function(advTime ...
- 微信支付接口--超详细带注释代码--Demo
如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ 如果解决不了,可以在文末进群交流. 如果对你有帮助的话麻烦点个[推荐]~最好还可以follow一下我的GitHub~感谢观看! 微 ...
- 【hadoop】hadoop3.2.0的安装并测试
前言:前段时间将hadoop01的虚拟机弄的崩溃掉了,也没有备份,重新从hadoop02虚拟上克隆过来的,结果hadoop-eclipse插件一样的编译,居然用不起了,找了3天的原因,最后还是没有解决 ...