php time()和microtime()有时候不一致

zoy*_*oyd 5 php time microtime

在使用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);
}
?>
Run Code Online (Sandbox Code Playgroud)

现在,由于$ microtime在$ time之前被宣布,我希望它更小,并且不应该输出任何东西; 然而,这显然不是这种情况,并且时不时地,$ time小于microtime()返回的秒数,如本例(截断)输出:

1344536674 : 0.15545100 1344536675
1344536675 : 0.15553900 1344536676
1344536676 : 0.15961000 1344536677
1344536677 : 0.16758900 1344536678
Run Code Online (Sandbox Code Playgroud)

现在,这只是一个小差距; 然而,我观察到一些系列的差异(相当)超过一秒...所以,这怎么可能?

phi*_*hag 6

如果你看一下的实现timemicrotime,你看他们是完全不同的:

由于C time调用仅精确到一秒,因此它也可能故意使用低保真时间源.

此外,在现代x86_64系统上,通过查看某些CPU寄存器,可以在没有系统调用的情况实现这两个C函数.如果您使用的是多核系统,则这些寄存器可能与核心不完全匹配,这可能是一个原因.

造成差异的另一个可能原因是NTPd(一个计时守护进程)或其他一些用户空间进程正在改变时钟.通常,应该避免这些影响adjtime.

所有这些理由都​​非常深奥.要进一步调试问题,您应该: