当前位置:  开发笔记 > 编程语言 > 正文

负载平衡群集中的PHP会话 - 如何?

如何解决《负载平衡群集中的PHP会话-如何?》经验,为你挑选了3个好方法。

好的,所以我有一个非常罕见的负载平衡PHP网站的独特场景.无赖是 - 它不习惯负载平衡.现在我们开始遇到问题......

目前唯一的问题是PHP会话.当然没有人首先想到这个问题所以PHP会话配置保持默认值.因此,两个服务器都有自己的一小部分会话文件,并且有一个用户将下一个请求抛给另一个服务器,因为它没有在第一个服务器上创建的会话.

现在,我一直在阅读PHP手册,了解如何解决这种情况.在那里我发现了很好的功能session_set_save_handler().(而且,巧合的是,关于SO的这个主题)整洁.除了我必须在网站的所有页面中调用此功能.未来页面的开发人员也必须记住一直调用它.感觉有点笨拙,更不用说可能违反了十几种最好的编码习惯.如果我可以翻转一些全局配置选项和Voilà会更好- 会话全部神奇地存储在DB或内存缓存中.

关于如何做到这一点的任何想法?


补充:澄清 - 我希望这是标准解决方案的标准情况.仅供参考 - 我有MySQL数据库可用.当然必须有一些现成的代码可以解决这个问题吗?当然,我可以编写我自己的会话保存内容,Gregauto_prepend指出的选项看起来很有希望 - 但这会让人觉得重新发明轮子.:P
补充2:负载均衡基于DNS.我不确定这是如何工作的,但我想它应该是这样的.
添加3:好的,我看到一个解决方案是使用auto_prepend选项session_set_save_handler()在每个脚本中插入一个调用并编写我自己的数据库容器,可能会调用以memcached获得更好的性能.很公平.

是否还有一些方法可以避免自己编码?像一些着名且经过良好测试的PHP插件?

很久以后添加了很多:这就是我最终的方式:如何在PHP + MySQL中正确实现自定义会话持久化?

此外,我只是在所有页面中手动包含会话处理程序.



1> Oliver Fried..:

您可以将PHP设置为处理数据库中的会话,因此所有服务器共享相同的会话信息,因为所有服务器都使用相同的数据库.

可以在这里找到一个很好的教程.


我不同意.在数据库中存储PHP会话是解决此问题的完美解决方案.
这不是正确的方法.问题是PHP会话,忘了数据库,我们谈的是PHP.这个解决方案仅仅是一种解决方法.
@MattFletcher对这个问题的解决方案很差.应该使用内存存储,如redis,memcached或ramfs等
您可以随时使用Redis

2> Doug Johnson..:

我们处理这个的方式是通过memcached.所需要的只是更改php.ini,类似于以下内容:

session.save_handler = memcache
session.save_path = "tcp://path.to.memcached.server:11211"

我们使用AWS ElastiCache,因此服务器路径是一个域,但我确信它对于本地memcached也是类似的.

此方法不需要任何应用程序代码更改.


memcached是存储会话的混合祝福.它快速,易于设置,但当内存不足时,它将破坏旧会话,因此永久会话存储将无法正常工作.在使用它之前,应该考虑这个数据丢失是否适合他的应用程序.

3> Ian..:

您没有提到您用于负载平衡的技术(软件,硬件等); 但无论如何,您的问题的解决方案是在负载均衡器上使用"粘性会话".

总之,这意味着当来自"新"访问者的第一个请求进入时,会从群集中为他们分配一个特定的服务器:然后将会话生命周期的所有未来请求定向到该服务器.实际上,这意味着在单个服务器上编写的应用程序可以扩展到平衡环境,代码更改为零/很少.

如果您使用的是硬件平衡器,例如Radware设备,则粘性会话将配置为群集设置的一部分.硬件设备通常会为您提供更细粒度的控制:例如,为新用户分配哪个服务器(他们可以检查健康状况等,并选择最健康/最少使用的服务器),以及更多控制服务器时发生的情况失败并退出群集.硬件平衡器的缺点是成本 - 但它们是值得的imho.

至于软件平衡器,它取决于您使用的是什么.对于Apache,在mod_proxy上有一个stickysession属性 - 并且有很多文章通过谷歌来使这个与php会话一起工作(例如)


编辑:从原始问题后发布的其他评论中,听起来您的"平衡"是通过循环DNS完成的,因此上述内容可能不适用.我将不再进一步评论并开始对抗循环dns的火焰.

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有