在使用 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 and microtime,你会发现它们完全不同:
-
time
只是调用Ctime功能。
-
microtime
has two实现:如果 C 函数gettimeofday可用(在 Linux 系统上应该如此),它被称为直接的。否则他们用杂技表演了一些杂技来计算时间。
自从Ctime
呼叫仅精确到一秒,它也可能故意使用低保真时间源。
此外,在现代 x86_64 系统上,两个 C 函数都可以实现没有系统调用通过查看某些CPU寄存器。如果您使用的是多核系统,这些寄存器可能在内核之间不完全匹配,这可能是一个原因。
造成差异的另一个潜在原因是 NTPd(计时守护进程)或其他一些用户空间进程正在更改时钟。通常,应通过以下方式避免这些影响:adjtime.
所有这些理由都非常深奥。要进一步调试问题,您应该:
- Determine OS and CPU architecture (hint: and tell us!)
- Try to 强制在一个核心上执行该进程
- 停止任何正在(或可能正在)调整系统时间的程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)