如何在多个 apache 服务器上管理单个 PHP5 会话?
Posted
技术标签:
【中文标题】如何在多个 apache 服务器上管理单个 PHP5 会话?【英文标题】:How to manage a single PHP5 session on multiple apache servers? 【发布时间】:2011-09-23 08:51:10 【问题描述】:您好,我必须从多个 Web 服务器检索数据。首先,我以用户身份登录我的网站。成功登录后,我必须从不同的 Web 服务器获取数据并显示。如何与多个服务器共享单个会话。我怎样才能做到这一点?
当我第一次登录时,它会创建保存在该服务器的临时文件夹中的会话和会话 ID。当我尝试访问另一台服务器时,如何使用登录时已经创建的当前会话。有人可以提出解决方案吗?
【问题讨论】:
【参考方案1】:您必须使用另一个会话处理程序。
你可以:
构建您自己的(参见session_set_save_handler
)或
使用提供自己的会话处理程序的扩展,例如memcached
【讨论】:
memcache 和 memcached 哪个更好? memcached 似乎问题少了很多,而且更稳定【参考方案2】:作为对所有这些答案的补充:
如果您将会话存储在数据库中,请检查 PHP 中会话的垃圾收集是否真的被激活(在类似 Debian 的发行版中并非如此,他们决定使用自己的 cron 垃圾会话并更改php.ini 使其永远不会启动任何 gc,因此请检查 session.gc_probability
和 session.gc_divisor
)。数据库中会话存储的主要问题是它意味着大量的写入查询和数据库中的大量冲突访问。这是向 mysql 等数据库服务器施加压力的好方法。所以恕我直言,使用另一种解决方案会更好,这会使您的读/写比率保持在更好的网络数据库方式中。
您还可以保留文件存储系统,并在服务器之间使用 NFS 共享文件目录。更改session.save_path
设置以使用/tmp
以外的其他设置。但是 NFS 从定义上讲并不是使用磁盘的最快方式。首选 memcached 或 mongodb 以便快速访问。
如果您需要在服务器之间共享的唯一内容是身份验证,那么您可以共享身份验证凭据,而不是共享真实的会话存储。就像 SO 中的 OpenId 系统,我们称之为 SSO,对于 Web 部件,您有多种解决方案,从 OpenId 到 CAS 等等。如果数据在客户端(ajax、ESI-gate)合并,那么您实际上不需要在服务器端进行公共会话数据存储。这将避免 5 个受影响的 Web 应用程序中的 3 个同时在共享会话中写入数据。其他会话共享技术(数据库、NFS,甚至 memcached)主要用于在多台服务器之间共享您的数据,因为负载平衡工具可以将您的顺序 HTTP 请求从一台服务器发送到另一台服务器,但如果您真的是指并行收集数据,您真的应该学习 SSO。
【讨论】:
【参考方案3】:另一种选择是使用memcached 来存储会话。
重要的是您必须拥有一个共享资源——无论是 SQL 数据库、memcached、NoSQL 数据库等,所有服务器都可以访问。然后使用session_set_save_handler 访问共享资源。
【讨论】:
【参考方案4】:将其存储在数据库中 - 让所有服务器连接到同一个数据库。 “php store session in database”的第一个结果
【讨论】:
【参考方案5】:将会话存储在可从整个服务器池访问的数据库中。
【讨论】:
我将会话信息存储在数据库中,但仍然无法访问。目前我正在做一个非常小的项目,并从 PHP 开始......我有一台带有数据库的主机和另一台我正在共享该数据库的机器,在数据库存储会话中使用 session_set_save_handler......请告诉我如何访问。我有登录页面,登录页面后重定向到仪表板,所以一旦登录将会话存储在数据库中,下次同一用户来时不要去登录页面,它应该去仪表板页面....我该怎么做请告诉我.....以上是关于如何在多个 apache 服务器上管理单个 PHP5 会话?的主要内容,如果未能解决你的问题,请参考以下文章
托管单个 phpMyAdmin 来管理多个任意远程 mysql 服务器
网站环境apache + php + mysql 的XAMPP,如何实现一个服务器上配置多个网站?
markdown [php:SSO]单个登录在memcached共享会话的多个服务器上。 #php #cakephp #linux