Microtime总是返回多个相同的值?

时间:2013-06-16 01:13:06

标签: php time microtime

因此,我创建了一个文件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

亲切的问候。

3 个答案:

答案 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);也可以工作(它睡一纳秒)。