因此,我创建了一个文件microtime.php
,并在Windows Server 2008 R2 64x Enterprises
运行nginx
专用服务器上对其进行了测试。
<?php
for ( $i = 0; $i <= 5; $i++ ) {
echo time() . '<br />';
echo microtime() . '<br />';
echo '<br />';
}
?>
我得到了这个:
1371343916
0.52320400 1371343916
1371343916
0.52320400 1371343916
1371343916
0.52320400 1371343916
1371343916
0.52320400 1371343916
1371343916
0.52320400 1371343916
1371343916
0.52320400 1371343916
为什么结果相同以及如何解决?
相反,我应该得到这样的东西:
1371345446
0.61877300 1371345446
1371345446
0.61878200 1371345446
1371345446
0.61878500 1371345446
1371345446
0.61878700 1371345446
1371345446
0.61878900 1371345446
1371345446
0.61879100 1371345446
亲切的问候。
答案 0 :(得分:1)
简短回答:微量时间值的重复与微时间的更新频率有关。您在每次更新之间多次请求值。以前曾询问过相关问题。 How precise is the internal clock of a modern PC?对我来说很有用,可以理解为什么会这样。另外,搜索“HPET”和“精确计时器”。
更高的准确度:您可以通过将微缩胶片爆炸成微秒和秒并将每一个乘以10 ^ 8(比如说)然后再将它们加在一起来使其更准确。将其转换为字符串并回显将在“小数点后”右侧显示更多数字。旁白:我把它称为正确到八分之一,因为有趣的是,它没有英文单词。
以下是一些代码来证明这一点:
echo 'MICROTIME: '.microtime()." ";
list($microseconds,$seconds) = explode(' ',microtime());
$precisedatetimestamp = number_format((($seconds * 100000000) + ($microseconds * 100000000)),"0","","");
settype($precisedatetimestamp,'string');
echo ' ..RETURNED : '.number_format($precisedatetimestamp,0,"","").'<br />';
循环几千次,看看结果。即使具有这样的准确度,您也不会阻止重复,它只意味着更少的重复。处理器速度快(并且速度更快),并且每秒可以执行大量指令。这是您的目的所需的准确度问题。它只能与内部时钟的更新频率一样正确。
答案 1 :(得分:0)
在Mac OSX Lion上,当我运行你的代码时,我得到:
1371583001
0.01606600 1371583001
1371583001
0.01609400 1371583001
1371583001
0.01610400 1371583001
1371583001
0.01611200 1371583001
1371583001
0.01612100 1371583001
1371583001
0.01612900 1371583001
因此,您似乎需要运行更多迭代才能在Windows中更改结果。
答案 2 :(得分:0)
记录下来,有7.2个以上的窗口(但我也在其他机器上进行了测试,结果相同)。
<?php
for ( $i = 0; $i <= 1000; $i++ ) {
$k1=microtime();
usleep(1);
$k2=microtime();
if($k1==$k2) echo "error k1 and k2<br>";
}
?>
它没有复制。
显然,usleep会从系统重新加载正确的时间。
编辑:time_nanosleep(0,1);也可以工作(它睡一纳秒)。