[转载]利用memcached在多台服务器之间共享PHP的session数据

[转载]利用memcached在多台服务器之间共享PHP的session数据

最近我的几篇文章都是是最近项目的一点心得^^
这个项目一开始就设计的“很大”,考虑了很多负载均衡方面的东西,比如采用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服务器去,

大致的配置过程可以参加我之前的文章:使用nginx配置多个php fastcgi负载均衡

第二步,为php fastcgi服务器安装php-memcache扩展,参见:memcached、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://$host:$port ";
ini_set('session.save_handler', 'memcache');
 ini_set('session.save_path', $session_save_path);

其中$host是memcached服务器的ip地址,$port是memcached监听的端口。

执行了如下代码以后,所有php fastcgi服务器的session操作都同步到了memcached服务器,而对于项目的php代码来说,以前该怎么用还是怎么用,完全可以不用像这篇博客开头那样,以为要改写php的session处理函数了。

再次感叹一下,php官方的说明文档真是无比强大…以后真不应该这么自信,还是应该先去官方仔细找找~

转发:http://xuebingnanmm.iteye.com/blog/686825

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114085.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 怎样创建FTP服务器

    怎样创建FTP服务器1W次浏览2016.07.21更新用IIS建立FTP服务器不是非常复杂,操作起来比较简单,类似于用IIS建立网站,其中涉及的虚拟目录等概念和网站中的虚拟目录一致。用IIS建立FTP服务器不是非常

    2022年7月4日
  • OA工作流-Activiti(一)[通俗易懂]

    OA工作流-Activiti(一)[通俗易懂]OA工作流-Activiti(一)一、工作流定义工作流:一系列相互衔接、自动进行的业务活动或任务。OA工作流:建立于网络办公自动化基础上的事务行政审批,业务申请审批、公文、信息等的网上流转。它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。    不同于以往我们在仅仅进行增删改查(CRUD),我们还…

    2022年6月23日
  • 操作系统进程调度算法(c语言实现)

    操作系统进程调度算法(c语言实现)进程调度算法一、先来先服务(FCFS)基本思想:先到达的进程先进入就绪队列,先进行调度的原则。非抢占方式。二、短作业优先(SJF)基本思想:根据进程中的执行时间,选取执行时间最短的作业优先调度;可有抢占或非抢占方式。三、优先权高者优先(HPF)基本思想:系统根据作业的优先权进行作业调度,每次选取优先权高的作业优先调度。作业的优先权通常用一个整数表示,也叫做优先数。可有抢占或非抢占方式。…

    2022年10月21日
  • Java 的JSON、XML转换方法——目录索引(转)[通俗易懂]

    Java 的JSON、XML转换方法——目录索引(转)[通俗易懂]Java 的JSON、XML转换方法——目录索引(转)

    2022年4月22日
  • jsonify返回中文乱码的问题

    jsonify返回中文乱码的问题参考博客:解决flask中文乱码的问题返回内容如图:实际填写的内容:从网上找答案,结果很多都是说配置app.config,如下:app.config[‘JSON_AS_ASCII’]但我试了之后,还是不可能正常显示汉字,最终还是通过配置app.config解决,只是增加了一这一项:参考博客:PythonWEB框架之Flask…

    2022年5月16日
  • 几种 IO编程比较

    几种 IO编程比较参考:Netty权威指南第一版Java网络IO编程总结(BIO、NIO、AIO均含完整实例代码)1.传统的BIO模型通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行处理,处理完之后,通过流返回应答给客户端,线程销毁。这就是典型的—请求—应答通信模型。该模型最大的问题就是缺乏弹性伸缩能力,当客户端并发量增加后,服务端的线程

    2022年4月30日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号