PHP将其会话信息存储在建立该会话的服务器主机的文件系统上.在多主机PHP环境中,负载在每个主机之间非智能地分布,每个请求都不能使用PHP会话变量(除非偶然将请求分配给同一主机 - 假设我们无法控制负载均衡器) .
这个名为"The Hitchhikers PHP负载平衡指南"的网站建议覆盖PHP会话处理程序并将会话信息存储在共享数据库中.
您认为,在多PHP主机环境中维护会话信息的最佳方法是什么?
更新:感谢您的反馈.对于任何寻找示例代码的人,我们找到了一个关于为MySQL编写Session Manager类的有用教程,我建议您查看.
我正在尝试在PHP + MySQL中实现自定义会话持久化.大多数东西都是微不足道的 - 创建你的数据库表,创建你的读/写函数,调用session_set_save_hander()等等.甚至有几个教程为你提供了示例实现.但不知何故,所有这些教程都方便地忽略了一个关于会话持久性的微小细节 - 锁定.现在,真正的乐趣开始了!
我看了一下PHP 的session_mysql PECL扩展的实现.这使用MySQL的功能get_lock()和release_lock().看起来不错,但我不喜欢它的做法.锁定在读取功能中获取,并在写入功能中释放.但是如果写函数永远不会被调用怎么办?如果脚本以某种方式崩溃,但MySQL连接保持打开(由于池或其他东西)怎么办?或者如果脚本进入致命的僵局怎么办?
我刚遇到一个问题,一个脚本打开一个会话,然后尝试flock()通过NFS共享一个文件,而另一个计算机(托管该文件)也做同样的事情.结果是flock()-over-NFS调用在每次调用时阻止脚本大约30秒.它是在20次迭代的循环中!由于这是一个外部操作,PHP的脚本超时不适用,并且每次访问此脚本时会话都被锁定超过10分钟.而且,幸运的是,这是每5秒钟由AJAX shoutbox进行轮询的脚本......主要的showstopper.
我已经对如何以更好的方式实现它有一些想法,但我真的想听听其他人的建议.我没有那么多使用PHP的经验来了解哪些细微的边缘情况在阴影中隐约可能有一天会危及整个事物.
添加:
好吧,似乎没有人有任何建议.那么,这是我的想法.我想对这可能出错的地方提出一些意见.
INSERT IGNORE INTO sessions (id, data, lastaccesstime, locktime, lockid) values ($sessid, null, now(), null, null);- 这将创建会话行(如果它不存在),但如果它已经存在则不执行任何操作;UPDATE sessions …我正在开发的项目基于使用负载均衡器的多个服务器.问题是我无法通过所有服务器维护PHP会话.通过Load Balancer管理会话的最佳方法是什么?