1

我有两个关于微时间精度的“类似”问题。


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

就我而言,微意味着 1/100000。那么为什么 microtime 会为“micro”部分返回 8 个整数,而最后两个总是零呢?或者我应该玩一些彩票,因为我很开心:)?


2) Microtime 有时用于生成 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

这怎么可能?我的电脑没有新电脑那么快。这很危险吗?顺便说一句,我正在使用额外的“br”输出,这会使代码运行速度变慢:P。


更新根据评论,这是微日期(真)。

1401106486.9772
1401106486.9772
1401106486.9772
1401106486.9772
1401106486.9772
1401106486.9772
1401106486.9772
1401106486.9772
1401106486.9772
1401106486.9772

引用希腊人 Zorba 的话:彻底的灾难!

4

2 回答 2

3

这里有两个问题:脚本执行速度非常快,“echo”只输出前几个小数点。这个脚本给出了更合理的结果:

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
于 2014-05-26T12:47:32.277 回答
1

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

基本上微时间进行系统调用,因此依赖于系统,其精度受硬件限制。

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

于 2014-05-26T12:44:25.183 回答