在使用microtime()(使用PHP 5)记录某些数据时,我遇到了一些与日志文件的时间戳似乎有些异的值,所以我只是尝试比较time()和microtime()的输出用一个简单的脚本(为了限制数据输出,此处就使用了usleep):
<?php
for($i = 0; $i < 500; $i++) {
$microtime = microtime();
$time = time();
list($usec, $sec) = explode(" ", $microtime);
if ((int)$sec > $time) {
echo $time . ' : ' . $microtime . '<br>';
}
usleep(50000);
}
?>
现在,由于$ microtime在$ time之前声明,因此我希望它会更小,并且什么也不会输出。但是,显然不是这种情况,并且$ time时不时地比microtime()返回的秒要小,如下面的示例(截断的)输出所示:
1344536674 : 0.15545100 1344536675
1344536675 : 0.15553900 1344536676
1344536676 : 0.15961000 1344536677
1344536677 : 0.16758900 1344536678
现在,这只是一个很小的差距。但是,我观察到一些序列(相差超过一秒)...那么,这怎么可能呢?
最佳答案
如果查看 time
和 microtime
的实现,您会发现它们根本不同:
time
仅调用C time
函数。 microtime
有两个实现:如果C函数 gettimeofday
可用(在Linux系统上应该是),则称为直截了当。否则they pull of some acrobatics to use rusage来计算时间。 由于C
time
调用仅精确到一秒,因此也可能有意使用低保真时间源。此外,在现代x86_64系统上,both C functions can be implemented without a system call by looking into certain CPU registers。如果您使用的是多核系统,则这些寄存器可能在各个核之间不完全匹配,这可能是一个原因。
产生差异的另一个潜在原因是NTPd(计时守护程序)或其他用户空间进程正在更改时钟。通常,应通过
adjtime
避免此类影响。所有这些基本原理都是深奥的。要进一步调试问题,您应该:
关于php time()和microtime()有时不一致,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11889809/