为多个主机上的 PHP 站点处理会话的最佳方法是啥? [关闭]

Posted

技术标签:

【中文标题】为多个主机上的 PHP 站点处理会话的最佳方法是啥? [关闭]【英文标题】:What is the best way to handle sessions for a PHP site on multiple hosts? [closed]为多个主机上的 PHP 站点处理会话的最佳方法是什么? [关闭] 【发布时间】:2010-09-09 18:07:19 【问题描述】:

php 将其会话信息存储在建立该会话的服务器主机的文件系统中。在多主机 PHP 环境中,负载不智能地分布在每个主机之间,PHP 会话变量不可用于每个请求(除非偶然将请求分配给同一主机 - 假设我们无法控制负载均衡器) .

This site, dubbed "The Hitchhikers Guide to PHP Load Balancing" 建议覆盖 PHP 会话处理程序并将会话信息存储在共享数据库中。

在您看来,在多 PHP 主机环境中维护会话信息的最佳方法是什么?

更新:感谢您的反馈。对于任何寻找示例代码的人,我们找到了 useful tutorial on writing a Session Manager class for mysql,我建议您查看它。

【问题讨论】:

【参考方案1】:

数据库,或数据库+内存缓存。一般来说,会话​​不应经常写入。从仅在会话数据发生更改时才写入数据库的数据库解决方案开始。稍后应添加 Memcache 作为性能增强。数据库解决方案将非常快,因为您只需要查找主键。确保数据库具有行锁定,而不是表锁定(myISAM)。 MemCache only 是个坏主意...如果它溢出、崩溃或重新启动,用户将被注销。

【讨论】:

虽然我同意 DB+memcached 是最好的解决方案,但我不会比 DB 更害怕它崩溃。当它溢出时,它应该从最旧的记录开始,所以强制注销将是最懒惰的用户。没那么糟糕,只要它很少发生【参考方案2】:

无论您做什么,都不要将其存储在服务器本身(即使您只使用一台服务器,或在 1+1 故障转移方案中)。它会让你陷入死胡同。

我会说,使用 Database+Memcache 进行存储/检索,它会让您脱离 Zend 的掌控(相信我在 Zend 的某些时候确实会出现问题)。由于您将能够轻松地按 UserID 或 SessionID 进行分区,即使使用 MySQL 也会使事情具有相当大的可扩展性。

(编辑:另外,使用 DB+Memcache 不会将您绑定到商业派对,也不会将您绑定到 PHP ——这可能会让您感到高兴)

【讨论】:

关于不绑定 PHP 的好处。为此,将会话序列化为 JSON 而不是 PHP 的本机格式可能也值得【参考方案3】:

将会话数据存储在共享数据库中是可行的,但速度可能会很慢。如果它是一个非常大的网站,memcache 可能是更好的选择。

【讨论】:

【参考方案4】:

根据您项目的预算,您还可以考虑将 Zend 平台用于您的生产机器,除了许多其他出色的功能外,它还包括可配置的会话集群,其工作方式有点像 CDN。

【讨论】:

以上是关于为多个主机上的 PHP 站点处理会话的最佳方法是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

获取站点访问者位置的最佳方法是啥? [关闭]

在多个站点之间共享数据库数据的最佳方式是啥?

从 serialize() AJAX 获取 PHP 中的多个/多个 POST 变量的最佳方法是啥?

使用 HttpClient 压缩对 asp.net core 2 站点的请求的最佳方法是啥?

在 PHP 和 MySQL 上处理时区的最佳方法是啥?

锁定文件以防止多个用户访问它的最佳方法是啥