同时的AJAX请求导致PHP会话无法正确更新


Simultaneous AJAX requests causes PHP Session not to be updated properly

在我的应用程序中,我有一个每10秒运行一次的AJAX请求,它告诉服务器用户仍然连接。当用户执行操作时,会向服务器发送另一个AJAX请求,该请求会在PHP$_SESSION变量中增加一个数字。

当这两个AJAX请求同时发生时,我似乎遇到了问题——$_SESSION中的数字有时不会增加。我相信这是因为当两个请求同时运行时,有时递增$_SESSION变量的请求会在另一个请求之前完成,因此最后一个请求会用旧数据"覆盖"会话。其他人有没有遇到过这个问题,或者知道如何解决它?

最简单的解决方案是在当前ajax请求完成处理后设置接下来10秒的超时。所以不要使用间隔,在完成时设置超时。

问题是由我的自定义会话处理程序(使用session_set_save_handler)引起的,该程序正在将会话信息保存到Oracle数据库中。它没有任何内容可以阻止两个同时修改会话的脚本。因此,为了阻止这种情况的发生,我使用flock()向会话"读取"处理程序添加了一个基于文件的锁。然后在"destroy"处理程序中删除文件并删除锁。

这解决了问题,但现在意味着AJAX请求似乎必须按顺序运行。