22

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

该站点被称为“PHP 负载平衡 Hitchhikers 指南”,建议覆盖 PHP 会话处理程序并将会话信息存储在共享数据库中。

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

更新:感谢您的反馈。对于任何寻找示例代码的人,我们发现了一个关于为 MySQL 编写会话管理器类的有用教程,我建议您查看。

4

4 回答 4

15

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

于 2008-09-16T20:48:00.723 回答
2

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

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

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

于 2008-09-16T21:14:04.670 回答
1

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

于 2008-09-16T20:41:22.457 回答
1

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

于 2008-09-16T20:53:51.707 回答