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

好吧,所以我得到了一个完全罕见的负载平衡PHP网站的独特场景。令人沮丧的是 - 它以前不是负载平衡的。现在我们开始遇到问题...

目前唯一的问题是PHP会话。当然,一开始没有人想到这个问题,所以PHP会话配置保持其默认值。因此,两个服务器都有自己的一小堆会话文件,而不幸的是,用户将获得下一个抛出的请求抛给另一个服务器,因为该服务器没有他在第一个服务器上创建的会话。

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

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


添加:澄清 - 我希望这是标准解决方案的标准情况。仅供参考 - 我有一个可用的MySQL数据库。当然,一定有一些现成的代码可以解决这个问题吗?当然,我可以写我自己的会话保存东西,Greg指出的选项似乎很有希望 - 但这感觉就像重新发明轮子一样。
:P 添加 2:负载平衡是基于 DNS 的。我不确定这是如何工作的,但我想它应该是这样的东西
添加 3:好的,我看到一个解决方案是使用选项在每个脚本中插入对的调用,并编写我自己的数据库持久化器,也许会抛出调用以获得更好的性能。很公平。auto_prependauto_prependsession_set_save_handler()memcached

有没有一些方法可以避免我自己编码所有这些?喜欢一些著名且经过良好测试的PHP插件?

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

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


答案 1

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

可以在此处找到一个很好的教程。


答案 2

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

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

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

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


推荐