[转载]利用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)
上一篇 2021年9月24日 下午6:00
下一篇 2021年9月24日 下午7:00


相关推荐

  • 缓存一致性协议——MESI

    缓存一致性协议——MESI我们知道 线程之间的可见性能用 volatile 关键字来解决 那么它为什么能解决呢 缓存包含 L1 L1d 数据缓存 存放数据 L1i 指令缓存 执行数据的指令码 L2 L3 其中 L3 是 CPU 共享 而 L1 和 L2 是每个 cpu 独占的缓存空间 这三级缓存都是集成在 CPU 内的缓存结构 他们的作用就是为 CPU 和主内存之间提供一个高速缓冲区 L1 最靠近 CPU 核心 L2 其次 L3 再次 运行速度方面 L1 最快 L2 次快 L3 最慢 容量大小方面 L1 最小 L2 较大 L3 最大 CPU 会先在最快的 L1 中寻找需要的数据 找不到再

    2026年3月19日
    2
  • 利用MATLAB求分段函数f(x)

    利用MATLAB求分段函数f(x)利用MATLAB求分段函数F(X)方法一建立M文件:function[y]=ch3_1(x)n=length(x);fori=1:nifx(i)>1y(i)=x(i)^2;elseifx(i)>-1y(i)=1;elsey(i)=3+2*x(i);en…

    2022年5月15日
    63
  • Pycharm 安装PyQt5所踩的坑

    Pycharm 安装PyQt5所踩的坑安装 PyQt5 找不到 Designer exe

    2026年3月17日
    3
  • win10图标上面有白纸_win10桌面部分图标变白,双击打不开

    win10图标上面有白纸_win10桌面部分图标变白,双击打不开方法1:第一步:新建txt(命名随意)复制以下文本:@echoofftaskkill/f/imexplorer.exeCD/d%userprofile%\AppData\LocalDELIconCache.db/astartexplorer.execho执行完成第二步:改txt扩展名为bat右键bat文件“以管理员身份运行”(此时会闪屏,之后F5手动刷新屏幕)…

    2022年10月10日
    6
  • MySQL修改root密码的4种方法

    MySQL修改root密码的4种方法方法1:用SETPASSWORD命令首先登录MySQL。格式:mysql>setpasswordfor用户名@localhost=password(‘新密码’);例子:mysql>setpasswordforroot@localhost=password(‘123’);方法2:用mysqladmin格式:mysqladmin-u用户名-p旧密

    2022年6月29日
    55
  • LightGBM 调参方法(具体操作)

    LightGBM 调参方法(具体操作)

    2021年11月21日
    59

发表回复

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

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