5

在使用 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

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

4

2 回答 2

6

如果您查看 and 的实现timemicrotime您会发现它们完全不同:

由于 Ctime调用仅精确到一秒,因此它也可能有意使用低保真时间源。

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

造成差异的另一个潜在原因是 NTPd(计时守护程序)或其他用户空间进程正在更改时钟。通常,应避免此类影响adjtime

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

于 2012-08-09T18:59:27.977 回答
0

这可能是由于 microtime() 使用浮点数,因此可能会出现舍入错误

您可以在 php.ini 中指定浮点数的精度

于 2013-03-06T10:27:09.383 回答