0

看看以下公认无用的代码:

<?php
session_start();
$_SESSION["key-".rand(1,1000)] = time();
print_r($_SESSION);
die();

如果您要从本地计算机运行它,它会打印出如下内容:

Array
(
    [key-272] => 1341011374
)

如果您将代码保持原样,然后刷新浏览器,您会看到与此非常相似的内容:

Array
(
    [key-272] => 1341011374
    [key-954] => 1341011374
    [key-895] => 1341011379
)

再次刷新:

Array
(
    [key-272] => 1341011374
    [key-954] => 1341011374
    [key-895] => 1341011379
    [key-337] => 1341011379
    [key-15] => 1341011869
)

依此类推,每次将两条记录添加到 $_SESSION 数组(不仅仅是我期望的一条)。另外,请注意在每对添加的记录中,第一个值与前一个添加的记录相同,但键是不同生成的随机数。

谁能解释这里发生了什么?

更新 1

正如我在评论中向其他人提到的,请注意第一个请求只设置一个$_SESSION 值,然后每次设置 2。

从第二个请求开始,当它为每个请求设置 2 个值时,时间戳不一样。如果请求发生了两次,您希望它们相同或接近,但每对中的第一个始终与前一个请求的时间戳相同,即使您在两者之间等待了很长时间。奇怪。

更新 2

我刚刚检查了 Firefox 和 Safari,起初得到了一些奇怪的结果,然后一切似乎都按预期工作,每个请求只添加了一条记录。我已经删除了所有代码,只留下了您在此处看到的代码,在一个普通的 index.php 文件中,其中没有其他代码。然而,在 Chrome 中,它的行为方式与我上面描述的完全相同。

似乎是一个以 Chrome 为中心或至少与 Chrome 相关的问题,但我仍然不知道为什么?除非您的每个脚本都是幂等的,否则让它们运行两次似乎是一个非常可怕的错误......

4

1 回答 1

0

如果您开始进行这些测试,请不要使用 rand 进行测试,因为这甚至可能是重复的。除此之外,不要只测试少量的测试(刷新),而是要进行相当数量的测试。您可以通过发送数千个请求以查看实质性结果的大量测试框架来做到这一点。还可以使用不同的浏览器进行测试以获得真实的测试结果。

根据会话的定义,它没有意义。加载图像或样式表等资源也可能会产生这些问题。

还要检查指向同一应用程序上其他页面的链接,因为它们可能已预加载。一般来说,POST 表单不会,但链接会。

由于 PHP 的标准,这个一般问题不太可能,这并不意味着它不可能是一个错误。不过,在用一种非常常见的传播语言思考结构性问题之前,首先要检查你身边的一切。如果存在这样的错误,它将损害很多很多网站。

于 2012-06-29T23:36:04.327 回答