我有一个使用Zend Framework,jQuery的ajax和Zend_Session的PHP应用程序。这个应用程序已经存在了大约7个月,并按照应有的方式工作。当用户登录后应用程序初始化时,将触发大约10个ajax请求,以将相关数据加载到仪表板类型页面。在那些请求完成之后,ajax请求主要是从那时起用户启动的。 当应用程序正常工作时,我们没有真正的负载平衡环境,我们有3个处理请求的应用程序服务器,但每个服务器都在本地存储PHP会话数据。最近我们对其进行了更改,以便每个应用服务器都连接到存储PHP会话数据的中央NFS共享。那是应用程序崩溃的时候。
现在发生的事情是页面初始化,我可以看到等待的ajax请求,但其中一半超时。如果我等待足够长的时间(约3-10分钟),那么所有用户启动的点击响应都很快。我们已经验证问题是由我们的会话处理更改引起的。
任何人都可以解释可能发生的事情,如何排除故障和/或解决方案?
我非常感谢你能给予的任何帮助。我一直把头发拉过来。
答案 0 :(得分:4)
对我而言,快速简便的解决方案是在DB中存储会话,不是吗? :) http://framework.zend.com/manual/en/zend.session.savehandler.dbtable.html
答案 1 :(得分:2)
这是一个常见问题。您可能遇到会话锁定问题。 PHP使用的默认会话保存处理程序,文件处理程序(以及Zend_Session默认使用的处理程序),使用flock()系统调用来锁定会话文件。
您如何选择发送单个HTTP请求的服务器?如果它只是随机的,并且任何给定的请求都可以由任何服务器处理,那么您可以很容易地想象服务器1处理初始请求,在NFS共享上创建会话文件以及获取并保持锁定的情况。那个文件。
下一个AJAX请求进入另一个服务器,该服务器上的PHP进程从客户端的cookie中读取会话ID,并尝试锁定NFS共享上的会话文件。由于第一台服务器仍然锁定了文件,因此您将被锁定并等待。
这可能是造成它的原因。当你开始尝试对PHP进行负载平衡时,这种情况很常见。
某些负载均衡器具有提供“粘性会话”的模式,其中平衡器足够智能,可以通过线路查看会话ID,并确保同一物理服务器处理给定会话的所有请求。它可以使你的负载平衡效率降低,但是为了摆脱这个问题是值得的。
或者,问题可能与其他问题有关。我不知道。
答案 2 :(得分:2)
可能有几个问题。
noac
选项挂载NFS共享,以尝试防止过时副本(What is close-to-open cache consistency?)。session_write_close()
已调用?)或未写入文件但仅在服务器的本地内存中