首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用memcache作为会话存储?

使用memcache作为会话存储?
EN

Stack Overflow用户
提问于 2010-10-07 18:56:56
回答 7查看 18.2K关注 0票数 12

我现在有个大问题。两天前,我的站点在一台服务器上运行得太多了,所以我又购买了两台,并让它们集群(rsync和load balanced)。

然后,我开始注意到,用户将访问服务器-1,然后在下一个请求中访问server3,但是他们的会话仍然在server1上而不是server3上,并且他们不再登录。

建议我将memcache用于会话存储。

我的脚本已经使用了$_SESSION

  • 我们能否安装memcache并启用会话处理程序支持,并将session.save_handler = "memcache"设置为强制php使用memcache?
  • 是否有任何应用程序编程需要进行使用memcache?
  • 这能解决我在服务器之间的会话问题吗?
  • 会话存储是在创建服务器时存储在所有服务器上,还是与主内存缓存服务器类似?

我使用的是码器框架

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-10-07 19:11:57

您需要设置memcache以在其中一个服务器上运行,并让所有服务器为会话使用相同的memcache实例。否则,如果它们各自运行自己的memcache实例,您将遇到与前面相同的问题。

除了相应地配置memcache并告诉PHP使用它作为会话处理程序之外,您不应该对代码进行任何更改。

~

为了澄清我在这里给出的建议,如果将所有三个服务器分组到一个池中,那么只要每个PHP实例以相同的顺序引用这些服务器,就不会有任何问题。memcache使用客户端散列,因此可以保证在同一台服务器上读取/写入相同的密钥。当然,如果您以任何方式更改该列表,则会话将变得无效。

memcache开发人员甚至不建议您使用memcache来存储会话数据,因为它不是持久的,因此,如果您必须重新启动memcache (或者发生了什么事情),那么您的所有用户都将被注销。

票数 2
EN

Stack Overflow用户

发布于 2012-03-02 00:32:12

问题有两部分:

如何处理发送到不同服务器的请求?

这取决于您的负载平衡器/反向代理。让客户端固定在一台服务器上是很常见的,通常是通过IP地址或代理设置的透明cookie。但是,如果您有一个分布式会话存储,则不需要为了会话而具有客户端的粘性,这就给我们带来了memcache。

如何将memcache用于多台服务器上的会话存储?

memcache有一个适当的共享-无分布式架构,所以大部分的智能都在客户端。因此,您应该继续使用memcache会话存储,但不要指向一个服务器,而是将其指向它们的所有。这是关于在医生里的。在您的php.ini中,您应该将session.save_path设置为memcached服务器列表,例如server1:11211, server2:11211

请注意,PHP中有两个不同的memcache客户端库,称为memcachememcached,它们对此属性具有不同的语法。

由于memcache的工作方式,您不关心会话数据存储在哪里--它是为您处理的。

正如NathanD所指出的,memcache是易失性的,在重新启动时会丢失数据,当您有多个服务器时,这意味着如果重新启动某个用户(但不是所有用户)将被注销。如果一台服务器完全死亡,您的会话存储将保持工作状态。会话数据位于死服务器上的用户将被启动,但他们可以在不存在该服务器的情况下重新登录并继续进行。

票数 14
EN

Stack Overflow用户

发布于 2010-10-07 19:43:58

两个主要的memcache PECL扩展都有会话处理程序。这两种方法都要求您在使用前安装PECL模块。

模缓存 PECL扩展会话处理程序在php.ini中启用了以下功能:

代码语言:javascript
运行
复制
session.save_handler = "memcache"
session.save_path = "tcp://memcacheServerAddressHere:11211?persistent=1&weight=2&timeout=2&retry_interval=10"

梅卡奇 PECL扩展会话处理程序在php.ini中启用了以下功能:

代码语言:javascript
运行
复制
session.save_handler = "memcached"
session.save_path = "memcacheServerAddressHere:11211"

注意,Memcache扩展似乎允许对Memcache环境进行更多的配置。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3884905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档