在多个主机上处理PHP站点的会话的最佳方法是什么?

时间:2008-09-16 20:34:39

标签: php mysql session load-balancing memcached

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我建议您查看。

4 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:2)

无论您做什么,都不要将其存储在服务器本身上(即使您只使用一台服务器,或者在1 + 1故障转移方案中)。它会让你走到尽头。

我想说,使用Database + Memcache进行存储/检索,它会让你远离Zend的掌握(并且相信我在Zend的某些时候会崩溃)。由于您可以通过UserID或SessionID轻松进行分区,因此即使使用MySQL也可以保持可扩展性。

(编辑:另外,使用DB + Memcache并不会将您绑定到商业聚会,它也不会将您绑定到PHP - 您可能会对此感到高兴)

答案 2 :(得分:1)

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

答案 3 :(得分:1)

根据项目的预算,您可能还会考虑生产机器的Zend平台,除了一系列其他强大功能外,还包括可配置的会话群集,其工作方式类似于CDN。

相关问题