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

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

最近我的几篇文章都是是最近项目的一点心得^^
这个项目一开始就设计的“很大”,考虑了很多负载均衡方面的东西,比如采用nginxphp的请求分摊到若干个运行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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • int是什么_uint16范围是多少

    int是什么_uint16范围是多少收到反馈:9位条码更改为12位后,条形码无法自动+1原因:条码的数值超过当前定义的变量的范围调整:将int类型的变量定义为Int64,调整后测试值可自动+1附:Int16值类型表示-32768~+32767之间的整数。Int32值类型表示-2,147,483,648~+2,147,483,647之间的整数。Int64值类型表示-9,223,…

    2022年8月15日
    3
  • MT4-EA自动化交易研究笔记(2022-04-23)

    MT4-EA自动化交易研究笔记(2022-04-23)目录昨日交易总体情况昨日EA更新内容待解决问题/对于交易策略的思考当前在用的EA介绍昨日交易总体情况实盘(第一张)与模拟盘(第二张)盈利情况对比图存在问题及分析昨天的实盘收益又是只有模拟盘的一半,原因还是对自己的交易系统不够自信,怕出现大行情大亏而根据自己的经验只跟了部分信号,有些信号开单前我把自动EA给关闭了,事后证明那些信号都是对的。昨天模拟盘是全程开着自动EA,无人工干预的,对于下午的那场大跌,虽然开仓有点早,而且是反向的,不过经过我的加仓策略,最终还是盈利出…

    2022年5月30日
    40
  • java helloworld源代码_java Hello world 源码执行流程详解

    java helloworld源代码_java Hello world 源码执行流程详解helloworld作为我们学习的第一个个程序,看起来很简单,但是要理解其执行的具体流程还是需要很深的功底,包括对组成原理,操作系统的理解,今天将javahelloworld进行整理一下吧!!废话不多说,先上helloworldpublicclassMain{publicstaticvoidmain(String[]args){Strings=”helloWorl…

    2022年5月28日
    61
  • lwip tcp_lwip udp发送

    lwip tcp_lwip udp发送欢迎查看本文所在的系列,STM32的LWIP应用,点击跳转1、tcp_arg()该函数用于传递给应用程序的具体状态,在控制块标志建立以后调用,即在函数tcp_new()调用之后才能调用功能指定应该传递给所有回调函数的应用程序的具体状态原型voidtcp_arg(structtcp_pcb*pcb,void*arg)参数pcb:当前TCP连接的控制块arg:需要传递给回调…

    2025年7月16日
    7
  • eclipse添加git插件(eclipse git使用教程)

    想必现在搞互联网编程的人没有人没有听过编程协作工具git了吧,命令行下面操作非常方便,功能也非常的强大。但是对于java编程的人员,eclipse肯定是他们编程的神器(肯定是首选),那么如何在eclipse里面使用git了?今天就来念叨念叨这事。

    2022年4月10日
    79
  • 全局获取Context的技巧

    全局获取Context的技巧

    2022年1月26日
    61

发表回复

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

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