为什么PHP会话似乎会自动重复?

时间:2012-06-29 23:23:08

标签: php session

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

<?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相关的问题,但我仍然不知道为什么?除非你的每个脚本都是幂等的,否则让它们运行两次似乎是一个非常可怕的错误......

1 个答案:

答案 0 :(得分:0)

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

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

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

这个一般性问题不太可能是因为PHP的标准,这并不意味着它不是一个bug。但是,在用一种相当普遍的传播语言思考结构问题之前,首先检查一下你身边的一切。如果会出现这样的错误,会对很多网站造成伤害。