看看以下公认无用的代码:
<?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数组中(不只是像我期望的那样)。另外,请注意在每对添加的记录中,第一个值与先前添加的记录相同,但键是不同生成的随机数。
有谁能解释这里发生了什么?
正如我在评论中向其他人提到的那样,请注意第一个请求只设置一个 $ _SESSION值,然后每次设置为2.
从第二个请求开始,当每个请求设置2个值时,时间戳不一样。如果请求发生了两次,您可能希望它们相同或接近,但每对中的第一个总是与上一个请求的时间戳相同,即使您在两者之间等待很长时间。奇异。
我刚刚在Firefox和Safari中查看过,最初得到了一些奇怪的结果,然后一切似乎按预期工作,每个请求只添加一条记录。我已经删除了所有的代码,只留下了你在这里看到的代码,在一个普通的index.php文件中没有其他代码。然而,在Chrome中,它的行为与我上面描述的完全相同。
似乎是以Chrome为中心或至少与Chrome相关的问题,但我仍然不知道为什么?除非你的每个脚本都是幂等的,否则让它们运行两次似乎是一个非常可怕的错误......
答案 0 :(得分:0)
如果您开始进行这些测试,请不要使用rand,因为这甚至可能是重复的。除此之外,不要只测试少量的测试(刷新),而是在适当的数量上进行测试。您可以通过大量测试框架来发送数千个请求以查看实质性结果。还可以使用不同的浏览器进行测试,以获得真实的测试结果。
根据会话的定义,它没有意义。加载某些资源(如图像或样式表)也可能会产生这些问题。
同时检查相同应用程序上其他页面的链接,因为它们可能已预先加载。一般来说POST表单不会,但链接会。
这个一般性问题不太可能是因为PHP的标准,这并不意味着它不是一个bug。但是,在用一种相当普遍的传播语言思考结构问题之前,首先检查一下你身边的一切。如果会出现这样的错误,会对很多网站造成伤害。