当同一客户端一次多次请求同一脚本时,PHP会话处理

时间:2010-03-01 21:04:00

标签: php session mutex

所以这是我的测试设置:

session_start();
if(!isset($_SESSION['bahhhh']))
    $_SESSION['bahhhh'] = 0;
$_SESSION['bahhhh']++;
sleep(5);
die('a'.$_SESSION['bahhhh']);

我期望发生的是每次点击页面时,都会返回不同的数字。

但是如果我使用多个标签,并在第一个标签的5秒内刷新它们,它们都返回相同的数字。 (这不是客户端缓存,因为5秒延迟仍然很明显。)

为什么要这样做,我该如何解决这个问题?

它似乎也存在与文件和数据库数据相同的奇怪缓存问题,并阻止我构建一个有效的互斥锁,以防止一次多次运行相同的代码。

这是另一个更简单的例子:

echo microtime();
sleep(10);

运行3次,每次间隔2秒,所有三次返回相同的微秒。 WTF?

3 个答案:

答案 0 :(得分:6)

默认情况下,会话数据在请求终止之前不会保存。因此,在睡觉时不会保存您的增量。如果您想过早保存会话,请结帐session_write_close()

答案 1 :(得分:0)

我希望脚本本身可以将某些内容添加到日志文件中,以验证脚本实际上是按照您的想法多次执行。也许你有一些软件在某个地方拦截请求并返回一个缓存的响应。

如果你的评论不适用于microtime(),我会解释php如何管理会话的可靠性,以及何时可能不会。

答案 2 :(得分:0)

显然这是我浏览器本身的一些错误。 Opera的行为方式与Internet Explorer不同。 我在IE中进行了初始测试,结果相同但代码更复杂。显然,复杂的代码有一个错误触发了IE中的错误行为,而这个简化的代码却没有。 抱歉打扰所有人。