2010-08-13 123 views
5

全部,PHP会话处理多个服务器

我有一个用Zend Framework和MVC编写的PHP5 Web应用程序。该应用程序安装在2台服务器上,安装相同。服务器X有php5/MySql/Apache和服务器Y也有相同的。我们在两台服务器之间没有公共的数据库服务器。

当通过服务器X和服务器Y上的https单独访问时,我的应用程序可以正常工作。但是,当我们打开负载均衡并使两台服务器都启动时,会话就会丢失。

如何确保我的会话在服务器间持续存在?我应该维护我的数据库在第三台服务器上,并写入会话吗?如果是这样,那么最简单和最安全的方法是什么?

感谢

回答

7

memcached是解决这个问题的一种流行方式。你只需要启动并运行(简单)并更新你的php.ini文件,告诉它使用memcached作为会话存储。

在php.ini应该修改:

session.save_handler = memcache 
session.save_path = "" 

对于总体思路:PHP Sessions in Memcached

有许多关于设置Zend会话处理程序以使用memcached的教程。拿你的选择。

0

我是否应该在第三台 服务器上维护数据库并向其写入会话?

是的,处理它的一种方法是让第三台机器运行数据库,以便两个Web服务器都使用该应用程序。过去我为几个项目完成了这项工作,并且运作良好。这种方法的问题是......是Web服务器或数据库的瓶颈。如果它在数据库中,则通过将Web服务器的负载平衡引入混合中,您看不到很多改进。您可能需要改为考虑数据库的镜像方案。

+0

您能否提供一个示例,用于从您过去的工作中存储数据库中的会话? – Jake 2010-08-16 19:50:24

+0

我使用家庭成员的类来手动处理会话(通过手动发送cookie头,而不是让PHP来做),所以我不知道这会对你有多大的帮助。 如果您想使用PHP的会话处理,请查看php文档中的会话处理函数。您想要分配一个将会话数据写入数据库表的session_set_save_handler()。然后进行相应的读取功能。我希望我能访问使用php的会话处理的旧代码,以便我可以将它们发送给您,但唉,我现在不再了。 – GrandmasterB 2010-08-16 20:38:25

+0

下面是我曾经做过的事......这可能是过时的,我不知道,因为我还没有用过PHP的会话处理。 HTTP://www.tuxradar。com/practicalphp/10/3/7只要确保你在会话ID上放了一个索引,否则它可能会很慢! – GrandmasterB 2010-08-16 20:46:01

0

另一种选择是在负载均衡器上使用粘性会话功能。这将做的是保持用户在某些服务器上。因此,当用户1来到站点时,他们将被引导到服务器X.每个后续请求也将被引导到服务器X.这允许您不必担心在服务器之间持续会话,因为每个用户将继续被引导到服务器他们有他们的会议。

其中一个缺点是,当您将Web服务器从池中取出时,有一半会话的用户将被注销。所以此解决方案的有效性取决于您将服务器从池中取出的频率。