我目前有一个很大的问题.两天前,我在一台服务器上运行的网站太多,所以我再购买了两台并将它们集群化(rsync和负载均衡).
然后我开始注意到用户会点击服务器-1,然后在下一个请求命中server3但是他们的会话仍然在server1而不是server3上,他们不再登录了.
我被建议使用memcache进行会话存储.
我的脚本已经使用了$_SESSION
.
我们可以安装memcache并启用会话处理程序支持并设置session.save_handler = "memcache"
为强制php使用memcache吗?
是否有任何应用程序编程需要使用memcache?
这会解决我的服务器问题之间的会话吗?
会话存储在创建时是存储在所有服务器上还是像主存储器服务器一样存储?
我正在使用codeiginiter框架
该问题分为两部分:
如何处理进入不同服务器的请求?这取决于您的负载均衡器/反向代理.通常通过IP地址或代理设置的透明cookie使客户端坚持一台服务器是很常见的.但是,如果您有一个分布式会话存储,那么就没有必要为会话提供客户端粘性,这会将我们带到memcache.
如何在多台服务器上使用memcache进行会话存储?memcache有一个适当的无共享分布式架构,因此大部分智能都在客户端.所以你应该做的是继续使用memcache会话存储,但不是指向一个服务器,而是将它指向所有服务器.这包含在文档中.例如,在php.ini中,您应该将session.save_path设置为memcached服务器列表server1:11211, server2:11211
.
请注意,PHP中有两个不同的memcache客户端库memcache
,memcached
并且它们具有不同的语法.
由于memcache的工作方式,您无需关心会话数据的存储位置 - 它会为您完成.
正如NathanD所指出的,memcache是易失性的,并且在重启时会丢失数据,当你有多个服务器时,这意味着如果重新启动了一些(但不是全部)用户,它们将被注销.如果一台服务器完全死亡,您的会话存储将继续工作.会话数据位于死服务器上的用户将被启动,但他们可以重新登录并继续运行,而不会存在该服务器.
这两个主要的memcache PHP PECL扩展都有会话处理程序.要么在使用前要求您安装PECL模块.
该内存缓存 PECL扩展会话处理程序与在php.ini中启用如下:
session.save_handler = "memcache" session.save_path = "tcp://memcacheServerAddressHere:11211?persistent=1&weight=2&timeout=2&retry_interval=10"
在Memcached的 PECL扩展会话处理程序与在php.ini中启用如下:
session.save_handler = "memcached" session.save_path = "memcacheServerAddressHere:11211"
请注意,Memcache扩展似乎允许更多配置Memcache环境.