<?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;

运行结果:

最新文章

  1. 【先定一个小目标】Redis 安装成windows服务-开机自启
  2. flexbox学习
  3. Delphi 中的自动释放策略-转
  4. DataGridView 设置某个列为只能为数字
  5. Luogu题目集合[6/未完待续]
  6. 爬虫获取邮箱,存入数据库,发送邮件java Mail
  7. noi 1996 登山
  8. asp.net @reqister指令
  9. Linux中crontab的坑爹环境变量问题
  10. 小结JS中的OOP(上)
  11. Java进程CPU使用率高排查
  12. 用java具体代码实现分数(即有理数)四则运算
  13. poj 2411 新写法
  14. HDU 4740 The Donkey of Gui Zhou (模拟)
  15. Linux从零到高手的进阶心得(转)
  16. Ansible1:简介与基本安装【转】
  17. 关于jquery全选反选 批量删除的一点心得
  18. 【转】深入浅出:Linux设备驱动之字符设备驱动
  19. 【如皋OJ】1127:正整数N转换成一个二进制数
  20. vue深入响应式原理

热门文章

  1. ②将SVN迁移到GitLab-多分支多标签迁移
  2. 什么是MBR
  3. OO第四单元(UML)单元总结
  4. tp框架防止表单重复提交
  5. ES6之promise原理
  6. layui.js源码分析
  7. hive 外部表和内部表的区别和相互转换
  8. DNS BIND配置 配置基本缓存服务器 DNS正向解析 DNS反向解析
  9. k8s安装之nginx.yaml
  10. [转]Linux网络 - 数据包的接收过程