通过多个ajax调用更新会话

时间:2011-11-10 10:43:35

标签: php ajax session session-variables

“问题:”
我多次使用ajax调用handler.php文件。

在handler.php中我有:

session_start();
$_SESSION['foo'] .= 'abc';

echo 'Session var: '.$_SESSION['foo'].'<br>';

现在,我看到的是:

Session var: abc
Session var: abc
Session var: abc
... etc

而不是:

Session var: abc
Session var: abcabc
Session var: abcabcabc

问题是什么?
我希望你明白这一点:)

编辑:我忘了提到有时我得到第二个(通常期望的),但大多数时候我得到第一个版本。

3 个答案:

答案 0 :(得分:2)

在向其添加内容之前,可能会将$_SESSION['foo']定义为空字符串:

session_start();

// prevent caching
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache");
header("Pragma: no-cache");

if (!isset($_SESSION['foo']))
  $_SESSION['foo'] = '';

$_SESSION['foo'] .= 'abc';

echo 'Session var: '.$_SESSION['foo'].'<br>';

检查您的浏览器是否启用了Cookie。

答案 1 :(得分:0)

我找到了解决方案......所以4个月后我就可以回答了:)

解决方案似乎很容易,但我没有先考虑它。我认为这是一个“更深层次”的问题,因为我的代码很长。所以解决方案是包含session_start();在“index.php”文件中,(您调用ajax本身或包含.js文件的位置)。 如果将来有人遇到这些愚蠢的“症状”,我希望这会有所帮助。* 因此,即使您不在“index.php”文件中使用会话,如果您想在ajax“handler”php文件中使用会话,也必须包含session_start()。

(当然,你也必须将session_start();包括在hander.php中。)

答案 2 :(得分:0)

我知道这是一个非常古老的问题,但是在遇到同样的行为之后,我想要确认我今天早些时候读到的内容时发生了这件事。

对于我的应用程序,我们已经在使用session_start()并使用自定义数据库处理程序处理会话。但是,在各种AJAX请求中将数据记录到会话时,我们仍然遇到错误。

运行操作会话数据的并发AJAX请求的问题是PHP默认情况下只允许一个脚本一次访问会话:从调用session_start()到退出时或以其他方式调用session_write_close ()。如果同时发生需要写入会话的多个AJAX请求,它们可以相互踩踏,最终会得到不完整的数据。

这比我能解释得更好:[http://konrness.com/php5/how-to-prevent-blocking-php-requests]。

我的特定解决方案是将数据存储在会话之外(数据库中的其他位置),以便其他AJAX请求不会踩到我的更改。