并发会话和 AJAX 的 PHP 问题

Posted

技术标签:

【中文标题】并发会话和 AJAX 的 PHP 问题【英文标题】:PHP trouble with concurrent sessions and AJAX 【发布时间】:2011-01-10 06:20:24 【问题描述】:

我有一个会话处理程序类,它在脚本末尾调用 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

如何确保一个页面在另一个页面有机会保存会话之前没有加载会话?

【问题讨论】:

这很有趣......尽管有大量 ajax 用于各种目的,但我从来没有遇到过这个问题(敲硅),所以我对这个问题的答案很感兴趣。 【参考方案1】:

假设是错误的。

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

换句话说,您可以同时为一个用户运行 100 个 AJAX 请求,而他们每个人都会等待轮到自己。

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

【讨论】:

以上是关于并发会话和 AJAX 的 PHP 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用子域和 AJAX 使 PHP 会话工作?

jQuery 和 ajax 在 PHP 中设置会话变量

jquery 和 php ajax 会话

Ajax 请求和会话

我如何在 php、mysql 和 ajax 的会话中显示用户在线或离线

使用 AJAX 检查 PHP 会话是不是存在或过期