2

所以我创建了一个文件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

亲切的问候。

4

3 回答 3

1

简短的回答:微时间中值的重复与微时间更新的频率有关。您在每次更新之间多次请求一个值。之前已经提出过相关问题。现代 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 />';

循环数千次并查看结果。即使具有这种准确度,您也不会阻止重复,这只会意味着更少的重复。处理器速度很快(而且越来越快),每秒可以执行大量指令。这取决于您的目的所需的准确性水平。它只能与内部时钟的更新频率一样正确。

于 2015-03-10T10:11:22.837 回答
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 中改变结果。

于 2013-06-18T19:22:01.507 回答
0

作为记录,7.2 + windows(但我也在其他机器上测试了相同的结果)。

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

于 2018-12-29T19:36:15.977 回答