PHP并发会话和AJAX的麻烦

时间:2010-01-28 03:43:22

标签: php database ajax session

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

public function __destruct()
{
    session_write_close();
}

但是,我注意到,对于我的一个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

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

1 个答案:

答案 0 :(得分:3)

假设是错误的。

  

...会话数据被锁定以防止   并发写入只有一个脚本可能   随时进行会话   http://us.php.net/session_write_close

换句话说,你可能同时为一个用户运行100个AJAX请求,他们每个人都会轮流等待。

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