10

在工作中,我们几乎用 Java 和 perl 做所有事情,但我想使用 PHP 和会话构建一个功能。一些窥视者认为尝试在我们的系统上进行 PHP 会话是一个坏主意,因为它分布在许多服务器上。具体问题会是什么?

4

5 回答 5

10

您还可以使用自定义会话保存处理程序:

http://www.php.net/manual/en/function.session-set-save-handler.php

我从未尝试过,但您可以使用它定义自己的保存/读取功能,因此您可以实现数据库或共享 nfs 后端,而无需安装任何扩展。

此外,@Eran Galperin 建议的 Msession 作为我之前提到的替代方案看起来非常有趣。

于 2008-11-01T15:42:04.723 回答
6

您的具体问题的答案,即问题是什么,在于默认情况下 PHP 将其会话存储在文件系统上的文件中。对于服务请求的单个网络服务器,这不是问题,因为您的会话数据将始终可用。但是,如果您有两个负载平衡的网络服务器来处理请求怎么办?

想象一下用请求访问第一个网络服务器,它会在其文件系统上创建您的会话文件。然后,您的下一个请求会到达第二个网络服务器。第二个网络服务器当然不会看到会话文件。对于用户来说,您可能会登录到一个网站,然后突然被注销。

这不是 PHP 特有的问题,而且很常见。解决方案是将会话数据存储在某个公共区域。最常见的方法是将会话数据存储在所有 Web 服务器都可以访问的数据库中,或者存储在一些共享内存缓存服务器(如 memcached)中。

于 2008-11-01T16:57:06.850 回答
4

跨多个服务器保持会话(也称为会话集群)是扩展 Web 应用程序的常见问题,并且并非特定于 PHP。PHP 确实提供了几种解决方案来处理它,例如Zend Platform(商业应用服务器)和Msession(扩展)。

于 2008-11-01T06:40:07.453 回答
0

一个相当模糊的问题,但我会说问题比答案中提到的要大。当然,您可以覆盖加载和保存 cookie 的方式,但它也有成本。例如,您将不得不考虑以下场景/问题:

  • 如果您将 cookie 放在另一台主机上,这将如何影响 cookie 的速度?这显然取决于您进行了多少次写入/读取。
  • 您这样做是为了提高速度还是进行故障转移?答案肯定会导致不同的解决方案:
    • 如果您这样做是为了进行故障转移,如果您的网络服务器由于网络链接断开而无法访问您的会话存储,您将如何处理?如果您的会话存储出现故障怎么办?您将不得不使用某种主-主复制来解决这个问题,可能在与网络服务器相同的机器上运行分布式会话存储以获得额外的高可用性(如果所有会话都可以放入内存)。看看Riak或类似的 master-master 复制。
    • 如果您只是为了速度而这样做,我会使用 apache、nginx 或(最快的)haproxy 来简单地根据客户端 IP 地址进行负载平衡。这样您就不必费心设置分布式会话存储。当然,如果您的一个 PHP 实例出现故障,您的用户将丢失他们的 cookie,但也许这不是问题。由你决定。
于 2011-12-09T10:05:57.120 回答
0

最简单的是 memcached 或 redis。

这是如何在 redis 中执行此操作 - 我们目前正在使用它: http ://redis4you.com/articles.php?id=001&name=Redis+as+session+handler+in+PHP

于 2012-05-05T09:37:34.380 回答