在使用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 避免此类影响。

    所有这些基本原理都是深奥的。要进一步调试问题,您应该:
  • 确定操作系统和CPU架构(提示:并告诉我们!)
  • 尝试force the process on one core
  • 停止正在(或正在)调整系统时间的所有程序。
  • 关于php time()和microtime()有时不一致,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11889809/

    10-09 02:59