PHP会话难以在分布式系统中扩展吗?

时间:2008-11-01 06:03:05

标签: php session distributed-system

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

5 个答案:

答案 0 :(得分:10)

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

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

我还没有尝试过,但有了它,你就可以定义自己的保存/读取功能,这样就可以实现数据库或共享的nfs后端而无需安装任何扩展。

同样是由@Eran Galperin提出的Msession,看起来非常有趣,可以替代我之前提到的那个。

答案 1 :(得分:4)

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

答案 2 :(得分:4)

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

想象一下,使用请求命中第一个Web服务器,该请求会在其文件系统上创建会话文件。然后,您的下一个请求将访问第二个Web服务器。第二个Web服务器当然不会看到会话文件。对于用户,您可以登录网站,然后突然登出。

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

最简单的是memcached或redis。

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