我有两个关于微时间准确性的“类似”问题。
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:总的灾难!
答案 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标志一起使用。