php - 使用 memcache 作为 session 存储?

标签 php codeigniter memcached

我现在遇到了一个大问题。两天前,我的网站在一台服务器上运行太多了,所以我又购买了两台服务器并将它们集群化(rsync 和负载平衡)。

然后我开始注意到用户会点击 server-1,然后在下一个请求中点击 server3,但他们的 session 仍然在 server1 而不是 server3 上,并且他们不再登录。

有人建议我使用 memcache 来存储 session 。

我的脚本已使用$_SESSION

  • 我们可以安装 memcache 并启用 session 处理程序支持并设置 session.save_handler = "memcache" 来强制 php 使用 memcache 吗?

  • 是否需要进行任何应用程序编程才能使用内存缓存?

  • 这可以解决我的服务器之间的 session 问题吗?

  • session 存储在创建时是否存储在所有服务器上,还是像主 Memcache 服务器一样?

我正在使用 codeiniter 框架

最佳答案

问题分为两部分:

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

这取决于您的负载均衡器/反向代理。让客户端固定在一台服务器上是很常见的,通常是通过 IP 地址或代理设置的透明 cookie。但是,如果您有分布式 session 存储,则不必为了 session 而具有客户端粘性,这将我们带到了内存缓存。

如何在多个服务器上使用memcache进行 session 存储?

memcache 具有适当的无共享分布式架构,因此大部分智能都位于客户端。因此,您应该做的是继续使用 memcache session 存储,但不要指向一台服务器,而是指向其中的所有。这已涵盖in the docs 。在 php.ini 中,您应该将 session.save_path 设置为 memcached 服务器列表,例如 server1:11211, server2:11211

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

由于内存缓存的工作方式,您不必关心 session 数据存储在哪里 - 它会为您处理。

正如 NathanD 指出的那样,memcache 是不稳定的,并且在重新启动时会丢失数据,当您有多个服务器时,这意味着如果重新启动一台服务器,部分(但不是全部)用户将被注销。如果一台服务器完全挂掉,您的 session 存储将继续工作。 session 数据位于失效服务器上的用户将被踢出,但他们可以重新登录并在该服务器不存在的情况下继续操作。

关于php - 使用 memcache 作为 session 存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3884905/

相关文章:

php - 如何在 PHP 中获取视频时长、尺寸和大小?

php - Facebook 登录困惑

php - CodeIgniter - 从 URL 中删除 "Index"

PHP-Memcached : MySql resource caching

php - Memcache 中的 replace 函数有什么意义?

php - 包括 file.php + id。这可以用 php 实现吗?

php - 在数组输出中添加单引号

php - 在 Doctrine 2 中,如何将列标记为非主键?

php - 计算mysql结果的平均值php

python - Memcached 使用哪个 Python 模块?