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