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

标签 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);
}
?>

现在,由于在 $time 之前声明了 $microtime,我希望它更小,并且永远不会输出任何内容;然而,这显然不是这种情况,$time 有时会小于 microtime() 返回的秒数,如本例(截断)输出所示:

1344536674 : 0.15545100 1344536675
1344536675 : 0.15553900 1344536676
1344536676 : 0.15961000 1344536677
1344536677 : 0.16758900 1344536678

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

最佳答案

如果您查看 time 的实现和 microtime ,您会发现它们完全不同:

由于 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/

相关文章:

php - Symfony 2.1 Doctrine 装置安装

java - 如何比较Time.sql

使用 fflush 的时钟不清除屏幕

php - 使用 php 创建 3 位数毫秒

php - 在 PHP 中获取时间滴答

php - 找不到 Slim 类。我不确定这里做错了什么

php - 设置引导日期选择器对象的值

php - 用输入框更新MySQL -- PHP MYSQL HTML

android - 如何在 SQLite 中查询等于今天的日期?