背景:对于很多中小型项目而言,PHP语言是个不错的选择。当访问有一定的量,为了加速响应时间,需要进行多台web服务器进行同时处理请求。

截屏20220225 下午10.01.22.png

如图所示: 1.客户端通过vip(虚拟ip地址)请求进入到SLB负载均衡。 2.SLB负载均衡器根据负载均衡算法(这里不是本文重点,不做介绍)将请求转发到web服务器。 3.web服务器中通过nginx+php-fpm提供服务。

在默认的情况下,php的session文件是保存在本机的/tmp目录中的。

这就存在一个问题: 1.对于同一个用户A,加入需要请求登陆服务,第一次请求被负载均衡转发到web1服务器处理。A用户输入username/password,成功获取到登陆状态。此时,A用户的session会话信息是保存在web1服务器中。 2.此时A用户再次访问页面,加入请求被转发到web2,由于web2机器中没有保存用户A的会话信息,致使A用户的不处于登陆状态(登陆状态丢失)。

针对这种分布式部署的php服务,如果在要保持session会话一致性,需要使用外部服务来保存session会话信息,而不是使用php的默认在服务器本地保存会话信息。

外部保存session会话的方式有多种,如mysql、memcache等等。 这里我们使用一个安装Memcache的机器作为保存session会话服务。

#修改php.ini
;session.save_handler = files
;session.save_path = "/tmp"
修改为
session.save_handler = memcached
session.save_path = "x.x.x.x:11211"

另外补充php中关于session会话几个重要参数:

session.gc_probability

session.gc_probability 与 session.gc_divisor 合起来用来管理 gc(garbage collection 垃圾回收)进程启动的概率。默认为 1。详见 session.gc_divisor。

session.gc_divisor

session.gc_divisor 与 session.gc_probability 合起来定义了在每个会话初始化时启动 gc(garbage collection 垃圾回收)进程的概率。

此概率用 gc_probability/gc_divisor 计算得来。 例如 1/100 意味着在每个请求中有 1% 的概率启动 gc 进程。session.gc_divisor 默认为 100。

session.gc_maxlifetime

session.gc_maxlifetime 指定过了多少秒之后数据就会被视为“垃圾”并被清除。 垃圾搜集可能会在 session 启动的时候开始(取决于 session.gc_probability 和 session.gc_divisor)。 默认为 1440(24分钟)。

session.cookie_lifetime

session.cookie_lifetime 以秒数指定了发送到浏览器的 cookie 的生命周期。值为 0 表示“直到关闭浏览器”。默认为 0。参见 session_get_cookie_params() 和 session_set_cookie_params()。

与session回收相关的重要参数

session.gc_maxlifetime = 1440
session.cookie_lifetime = 1440
session.gc_probability = 1
session.gc_divisor = 1000

补充说明 需要安装好php的memcached