13

嗨,我必须从多个 Web 服务器检索数据。首先,我以用户身份登录我的网站。成功登录后,我必须从不同的 Web 服务器获取数据并显示。如何与多个服务器共享单个会话。我怎样才能做到这一点?

当我第一次登录时,它会创建保存在该服务器的临时文件夹中的会话和会话 ID。当我尝试访问另一台服务器时,如何使用登录时已经创建的当前会话。有人可以提出解决方案吗?

4

5 回答 5

14

您将不得不使用另一个会话处理程序。

你可以:

于 2011-06-27T09:31:11.540 回答
10

作为对所有这些答案的补充:

如果您将会话存储在数据库中,请检查PHP 中会话的垃圾收集是否真的被激活(在类似 Debian 的发行版中并非如此,他们决定使用自己的 cron 对会话进行垃圾处理并更改 php.ini 以便它永远不会启动任何gc,所以检查session.gc_probabilityand session.gc_divisor)。数据库中会话存储的主要问题是它意味着大量的写入查询和数据库中的大量冲突访问。这是向 MySQL 等数据库服务器施加压力的好方法。因此恕我直言,使用另一种解决方案会更好,这可以使您的读/写比率以更好的网络数据库方式保持。

您还可以保留文件存储系统,并使用NFS在服务器之间简单地共享文件目录。更改session.save_path设置以使用 以外的其他内容/tmp。但是 NFS 从定义上讲并不是使用磁盘的最快方式。首选 memcached 或 mongodb 以实现快速访问。

如果您需要在服务器之间共享的唯一内容是身份验证,那么您可以共享身份验证凭据,而不是共享真实的会话存储。就像 SO 中的 OpenId 系统,也就是我们所说的 SSO,对于 Web 部件,您有多种解决方案,从OpenIdCAS, 和别的。如果数据在客户端(ajax、ESI-gate)合并,那么您实际上不需要在服务器端进行公共会话数据存储。这将避免 5 个受影响的 Web 应用程序中的 3 个同时在共享会话中写入数据。其他会话共享技术(数据库、NFS,甚至 memcached)主要用于在多台服务器之间共享您的数据,因为负载平衡工具可以将您的顺序 HTTP 请求从一台服务器发送到另一台服务器,但如果您真的是指并行收集数据,您真的应该学习 SSO。

于 2011-06-27T20:26:09.723 回答
7

另一种选择是使用memcached来存储会话。

重要的是您必须拥有一个共享资源——无论是 SQL 数据库、memcached、NoSQL 数据库等,所有服务器都可以访问。然后使用session_set_save_handler访问共享资源。

于 2011-06-27T09:30:14.800 回答
5

将会话存储在可从整个服务器池访问的数据库中。

于 2011-06-27T09:28:51.460 回答
5

将其存储在数据库中 - 让所有服务器连接到同一个数据库。“数据库中的 php 存储会话”的第一个结果

于 2011-06-27T09:29:06.847 回答