同一客户机同时多次请求同一脚本时的PHP会话处理

同一客户机同时多次请求同一脚本时的PHP会话处理,php,session,mutex,Php,Session,Mutex,下面是我的测试设置: session_start(); if(!isset($_SESSION['bahhhh'])) $_SESSION['bahhhh'] = 0; $_SESSION['bahhhh']++; sleep(5); die('a'.$_SESSION['bahhhh']); 我期望发生的是,每次我点击页面,它都会返回一个不同的数字 但如果我使用多个选项卡,并在第一个选项卡的5秒内刷新每个选项卡,它们都返回相同的数字。(这不是客户端缓存,因为5秒的延迟仍然很明显。) 为

下面是我的测试设置:

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?

会话数据在请求终止之前不会保存。因此,睡眠时不会保存增量。如果您想提前保存会话签出

我会让脚本本身在日志文件中附加一些内容,以验证脚本实际执行的次数是否与您想象的一样多。也许你有一些软件在某处拦截请求并返回缓存响应


如果不是因为你的评论,microtime()也会出现这种情况,我会解释php是如何管理与会话的一致性的,以及何时可能不一致。

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

正如我所说,我还使用了文件和数据库后端来实现这种方法。下面是另一个无法按预期运行的测试脚本:echo microtime();睡眠(10);如果您在多个选项卡中打开它,然后在10秒内刷新每个选项卡,ever tab将声称它是在完全相同的微秒内调用的(显然不可能)。我不明白存储介质与您的问题有什么关系。我在5个选项卡中测试了您的脚本,每个选项卡在10秒内刷新,每次都得到不同的输出。在Ubuntu9.10上使用最新的5.2.x进行测试。写入文件的困难在于,由于像microtime()这样的东西对所有实例都返回相同的结果,所以我无法区分所有三种写入文件的方式(因为它最终都是相同的文件名),或者只有一种。也就是说,我们在生产中遇到的错误是维护脚本运行了不止一次,并且自身也遇到了竞争条件,所以我确信所有三个副本都实际执行了。这就是我们试图构建互斥体的原因。