当前位置: 首页 > news >正文

集群中用Memcached来实现session共享

这几天在实现nginx集群的过程中,发现session使用存在问题,登录页面后有时候需要重复登录,和开发部沟通后,决定采用memcached来实现session的共享,这也是各大型网站推荐的方式。

开发部开始写了一些用memcache来保存session的代码后,测试效果不是很理想,还是存在问题,后来在一个blog上发现可以直接在php.ini中设定使用memcache作为session处理,而且无须另外编码,大大较少了开发成本,方法是:

修改php.ini中的以下值
session.save_handler = memcache
session.save_path = 'tcp://192.168.100.100:12000' 

重新启动apache,查看phpinfo就知道设置是否生效。


如果只想在特定的应用里使用memcache储存session,可以使用ini_set的方法对以上两个参数进行设定:
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "192.168.100.100:12000");

注:使用多个 memcached server 时用逗号”,”隔开,可以带额外的参数”persistent”、”weight”、”timeout”、”retry_interval” 等等,

类似这样的:"tcp://host:port?persistent=1&weight=2,tcp://host2:port2"。


要测试一下是否真正用上了memcache,可以先捕足到使用的PHPSESSID,再作为KEY用memcach去读一下,就清楚了,测试代码如下:

创建一个set_session.php代码:

//set_session.php
session_start();
if (!isset($_SESSION['admin'])) {
$_SESSION['TEST'] = 'chentao';
}
print $_SESSION['admin'];
print "\n";
print session_id();
?>


创建一个get_session.php代码:

//get_session.php
$mem = new Memcache;
$mem->connect("192.168.100.100", 12000);
var_dump($mem->get('9a971ff6b459d59950035e9aa5dbf88f'));
?>

在命令行,或者页面都可以执行,如果输出结果为:
string(16) "admin|s:3:"chentao";"
就证明 session 正常工作。

在生产环境里,你也可以查看调度服务器的访问日志,同一IP地址前后访问的服务器不一样,仍然可以共享session,比如我的nginx调度日志如下:

[root@localhost conf]# tail /var/log/nginx/test_access_log | awk {'print $1,$6,$7'} | sort
192.168.8.236 192.168.1.4:8080 200
192.168.8.236 192.168.1.9:8080 200
192.168.8.239 192.168.1.9:8080 200
192.168.8.239 192.168.1.9:8080 200
192.168.8.239 192.168.1.9:8080 200
192.168.8.26 192.168.1.4:8080 200
192.168.8.26 192.168.1.4:8080 200
192.168.8.26 192.168.1.4:8080 200
192.168.8.26 192.168.1.9:8080 200

转载于:https://www.cnblogs.com/liliuguang/p/8796704.html

相关文章:

  • AngularJs的表单验证
  • 如何查看linux中的ssh端口开启状态
  • Go 语言之 struct 结构体
  • 安卓设置背景图平铺,同时设置背景色
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 为用户管理连接 Confluence 6 到 Jira 应用程序
  • 加密算法:DigestUtils与java MessageDigest
  • Spring Extensible XML
  • mooc-IDEA alter enter--008
  • 20172318 2017-2018-2 《程序设计与数据结构》第6周学习总结
  • 坚持不走寻常路 解读“锐捷式”创新的三个突破
  • Java基础-正则表达式(Regular Expression)语法规则简介
  • 你不知道的js坑
  • 关于肥胖和美国为什么那么多胖子
  • 机器视觉技术太阳能光伏硅片EL检测方案
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [译] React v16.8: 含有Hooks的版本
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • 三栏布局总结
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • #NOIP 2014# day.1 T2 联合权值
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (笔试题)合法字符串
  • (生成器)yield与(迭代器)generator
  • (四)Android布局类型(线性布局LinearLayout)
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • .net core 6 集成和使用 mongodb
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • ??myeclipse+tomcat
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @vue/cli 3.x+引入jQuery
  • [1159]adb判断手机屏幕状态并点亮屏幕
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [Android Pro] Notification的使用
  • [C++]C++类基本语法
  • [codevs 1288] 埃及分数 [IDdfs 迭代加深搜索 ]
  • [EFI]Dell Inspiron 15 5567 电脑 Hackintosh 黑苹果efi引导文件
  • [GYCTF2020]Ez_Express
  • [halcon案例2] 足球场的提取和射影变换
  • [hdu4622 Reincarnation]后缀数组
  • [idea]关于idea开发乱码的配置
  • [iOS]让Xcode 4.2生成的app支持老的iOS设备(armv6)
  • [Java] 图说 注解
  • [java]删除数组中的某一个元素
  • [Latex学习笔记]数学公式基本命令
  • [Linux]进程间通信(进程间通信介绍 | 匿名管道 | 命名管道)
  • [OGRE]看备注学编程(02):打地鼠01-布置场地九只地鼠
  • [Operating System] {ud923} P4L4: Datacenter Technologies
  • [Redis] Redisson实现分布式锁
  • [Web 开发] URL 的最大长度