PHP并发会话和AJAX的麻烦

Xeo*_*oss 6 php database ajax session

我有一个会话处理程序类,在脚本的末尾调用session_write_close().这确保即使发出header()或exit(),也会保存会话数据.

public function __destruct()
{
    session_write_close();
}
Run Code Online (Sandbox Code Playgroud)

但是,我注意到,对于我的一个AJAX页面,数据库层提交了两个会话更新.

我的猜测是[1]页加载并发送[2] AJAX请求.[2] AJAX请求必须在[1]页面有机会调用之前启动会话session_write_close().

在[2] AJAX页面加载会话之后,[1]页面最终保存会话,然后在[2] AJAX请求保存会话后不久 - 这会覆盖第一个会话!

它可能看起来像这样:

[1] page loads session
[1] page sends output
[2] ajax loads session
[1] page saves session
[2] ajax sends output
[2] ajax saves session
Run Code Online (Sandbox Code Playgroud)

如何确保一个页面在另一个页面有机会保存会话之前没有加载会话,我该怎么办?

Xeo*_*oss 3

这个假设是错误的。

...会话数据被锁定以防止并发写入,任何时候只有一个脚本可以在会话上运行 http://us.php.net/session_write_close

换句话说,您可以同时为一个用户运行 100 个 AJAX 请求,并且每个请求都会轮流等待。

我的问题是在选择正确的会话表列时出错,导致每次加载时都重新创建我的会话。