热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

多台服务器之间共享PHP的session数据

通过设置session_save_handle为redis或者memcache,将session保存的位置进行修改。php.ini里的配置:image.png这个项目一开始就设计的

通过设置session_save_handle 为redis或者memcache,将session保存的位置进行修改。

php.ini里的配置:

《多台服务器之间共享PHP的session数据》 image.png

这个项目一开始就设计的“很大”,考虑了很多负载均衡方面的东西,比如采用[nginx]将[php]的请求分摊到若干个运行php fastcgi的独立服务器中。这样的设计除了在每个php fastcgi服务器中要保存一份程序的拷贝以外,还有一个亟待解决的问题。由于php fastcgi进程分别运行在不同的服务器上,默认的,php的session数据是在各个服务器上分别存放的,这样的话,如果在某一次php请求过后,nginx将php请求发送到了另外集群中的另外一台php fastcgi服务器,那么就会导致session的丢失。经过一系列考虑,项目组决定采用一台独立memcached服务器来存储整个项目的php session数据,再通过改写php的session处理函数来对memcached服务器进行数据读写,然后解决各个php fastcgi中session不同步的问题。

项目背景基本上就是上面说的那些,下面大概说说相关的网络环境,然后进入具体的配置、实现过程:

1、nginx服务器一台,IP地址:172.16.236.208 入口机器
2、php fastcgi服务器两台,IP分别为:172.16.236.210,172.16.236.211 负载机器
3、memcached服务器一台,IP为:172.16.236.220 共享数据

为了简化操作过程,上面的环境仅仅是达到项目需求的假设,实际项目中还有许多额外的处理。

首先,修改nginx虚拟主机配置,将php的请求分发到各个php fastcgi服务器去,

第二步,为php fastcgi服务器安装php-memcache扩展

啰嗦一句,这一步其实只需在一台服务器上进行,其他php fastcgi的配置其实可以偷懒,就是将之前编译好的memcache.so拷贝到需要配置的服务器中,然后修改php.ini可以加载这个扩展即可。

第三步,修改项目php源代码,使php的session存取使用memcached。
之前没有认真去读php的手册,先是自己写session的handler,然后又碰到一些奇怪的问题。最后在php官方的memcache说明中找到了最简单的办法,其实只要在调用session_start()之前执行如下代码:

$host = '172.16.236.220' ;
$port = '11211' ;
$session_save_path = "tcp://$host:$port?persistent=1&weight=2&timeout=2&retry_interval=10, tcp://$host1:$port1";
ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', $session_save_path);

其中《多台服务器之间共享PHP的session数据》port是memcached监听的端口。使用多个 memcached server 时用逗号”,”隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数”persistent”、”weight”、”timeout”、”retry_interval” 等等,类似这样的:”tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2” 。

测试数据:

session_start();
if (!isset($_SESSION['TEST'])) {
$_SESSION['TEST'] = time();
}
$_SESSION['TEST3'] = time();
print $_SESSION['TEST'];
print "

";
print $_SESSION['TEST3'];
print "

";
print session_id(); //19216821213c65cedec65b0883238c278eeb573e077
?>
可以直接用sessionid 去 memcached 里查询一下:
telnet 172.16.236.220 11211
get 19216821213c65cedec65b0883238c278eeb573e077
得到
TEST|i:1177556731;TEST3|i:1177556881;
这样的结果,说明session 正常工作

使用memcached的优缺点
1.用Memcached来存储 session 在读写速度上会比文件快很多,而且在多个服务器需要共用session时会比较方便,将这些服务器都配置成使用同一组Memcached服务器就可以,减少了额外的工作量。缺点是 session 数据都保存在 memory 中,持久化方面有所欠缺,但对 session 数据来说也不是很大的问题,如果要持久化数据,也可以使用新浪开发的MemcacheDB或日本人开发的Tokyo tyrant+Tokyo Cabinet。

单点故障问题的解决
2.另外,如何解决Memcached的单点故障问题,有以下几个方案:
 ①使用上面提到的Memcache::addServer增加多台Memcached,但这样只能达到一台出故障之后,另外一台可以使用,但每台Memcached的数据是独立的,如果不共享不复制,出故障的数据就丢失了。
 ②使用Memcached的一个补丁应用repcached,可以实现multi master replication和asynchronous data repliacation等故障转移的功能,并且支持原来Memcached的所有命令。不过这个应用只支持Memcached1.2.x版本。
 ③使用Tokyo tyrant+Tokyo Cabinet(简称TT+TC)。TT兼容Memcached协议,可以直接替换使用,TT支持replication,可以实现故障转移,TC则为TT提供持久化。
TT+TC是日本最大的社交类网站mixi.jp开发的开源应用,并已成功应用在mixi.jp中,值得研究。


推荐阅读
  • nginx+tomcat session 共享
    *tomcat1192.168.10.153*tomcat2192.168.10.154Tomcat工作模式必须为Nio模式。##添加如下内容,注意更换address ... [详细]
  • ApacheTrafficServer6.2.2发布了,TrafficServer是一套快速、模块化 ... [详细]
  • 变相的实现connect的超时,我要讲的就是这个方法,原理上是这样的:1.建立socket2.将该socket ... [详细]
  • 突然觉得服务器ssh密码登录总是浪费一定量的时间,就想试试用sshKey进行登录。生成服务器sshkey和本地sshkey$ssh-keygen在服务器上生成一个authorize ... [详细]
  • 11 微服务网关(一)概念介绍  Zuul简单入门
    11.1服务网关的概念11.1.1什么是微服务网关11.1.2作用和应用场景11.2常见的API网关实现方式11.3基于Nginx的网关实现IP地址映射到路径,统一 ... [详细]
  • 4种分布式Session的实现方式!老大直呼666...
    前言公司有一个Web管理系统,使用Tomcat进行部署。由于是后台管理系统,所有的网页都需要登录授权之后才能进行相应的操作。起初这个系统的用的人也不多& ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 本文介绍了在无法联网的情况下,通过下载rpm包离线安装zip和unzip的方法。详细介绍了如何搜索并下载合适的rpm包,以及如何使用rpm命令进行安装。 ... [详细]
  • 下图|通用型_企业用户如何选择合适的云服务器配置?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了企业用户如何选择合适的云服务器配置?相关的知识,希望对你有一定的参考价值。随着网络飞速发展,企业上云已成为 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有