PHP microtime()精度(最后为零)

时间:2014-05-26 12:00:01

标签: php time unique microtime

我有两个关于微时间准确性的“类似”问题。


1)正如PHP在线文档中所建议的那样,为了获得以微秒为单位的时间,我使用了以下代码和microtime()函数(循环):

<?php
    for ($i = 0; $i < 10; $i++) {
        list($usec, $sec) = explode(' ', microtime()); //split the microtime on space
        $usec = str_replace('0.', ' ', $usec); // remove the leading '0.' from usec
        echo date('YmdHis', $sec) .' '. $usec ."<br>"; 
    }
?>

我得到了以下结果:

20140526135144 72254300
20140526135144 72255900
20140526135144 72256500
20140526135144 72257100
20140526135144 72257600
20140526135144 72258100
20140526135144 72258600
20140526135144 72259100
20140526135144 72259600
20140526135144 72260100

就我而言,Micro意味着1/100000。 那么为什么microtime为“微”部分返回8个整数,最后两个总是为零?或者我应该玩一些乐透因为我很高兴:)?


2)例如,微时间有时用于生成uniqid。但是当我跑步时:

for ($i = 0; $i < 10; $i++) {
    echo microtime()."<br>";
}

我得到了:

0.21820300 1401105400
0.21821000 1401105400
0.21821100 1401105400
0.21821200 1401105400
0.21821300 1401105400
0.21821300 1401105400 // - the same as precursor
0.21821400 1401105400
0.21821500 1401105400
0.21821500 1401105400 // - the same as precursor
0.21821600 1401105400

怎么可能?我的电脑并不像新电脑那么快。 这有危险吗? BTW我正在使用额外的“br”输出,这会使代码运行得更慢:P。


更新根据评论,这是microdate(true)。

1401106486.9772
1401106486.9772
1401106486.9772
1401106486.9772
1401106486.9772
1401106486.9772
1401106486.9772
1401106486.9772
1401106486.9772
1401106486.9772

引用希腊语Zorba:总的灾难!

2 个答案:

答案 0 :(得分:2)

这里有两个问题:脚本执行速度非常快,而且回复&#34;仅输出前几个小数点。这个脚本提供了更合理的结果:

for ($i = 0; $i < 10; $i++) {
    echo number_format(microtime(true), 10, '.', '') . "\n";
    usleep(1000);
}

输出:

1401108499.0024349689
1401108499.0038080215
1401108499.0050148964
1401108499.0061480999
1401108499.0073280334
1401108499.0085520744
1401108499.0096609592
1401108499.0108559132
1401108499.0119121075
1401108499.0130879879

答案 1 :(得分:1)

我认为你应该参考这个问题的答案DECIMAL length for microtime(true)?

基本上,microtime进行系统调用,因此系统依赖于硬件限制的精度。

至于安全问题,您不应将microtime用作唯一ID。查看http://www.php.net/manual/en/function.uniqid.php并尝试将其与more_entropy标志一起使用。