【问题标题】:php time() and microtime() do sometimes not concordphp time() 和 microtime() 有时不一致
【发布时间】:2012-08-09 18:35:00
【问题描述】:

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

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

【问题讨论】:

  • 你能告诉我一些即将到来的大型比赛的结果吗?我想下一些赌注;)
  • 你能告诉我们你正在使用什么操作系统,这是在什么版本的 PHP 中发生的,以及编译 PHP 的 libc/glibc 版本是什么? microtime 在 Windows 上的工作方式与在 Linux 上的工作方式不同,但 Linux 上的这两个函数都依赖 C 函数来获取此信息,因此这很可能不是 PHP 问题。我在 PHP 5.4.5 上运行了您的代码,并且没有输出时间值(意味着时间总是大于或等于 microtime [正如预期的那样])。

标签: php time microtime


【解决方案1】:

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

由于 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
  • 停止任何正在(或可能正在)调整系统时间的程序。

【讨论】:

  • 好的,感谢您的详细提示。这似乎肯定与操作系统有关,因为它确实发生在我手头的两台 Windows 7 机器上,但显然不在我的主机的 linux 机器上......因为这可能是一个相当难以解决的问题,我想我会尝试找到一些替代微时间的使用......
【解决方案2】:

这可能是由于 microtime() 使用浮点数,因此 rounding errors may occur

你可以指定floating point numbers' precision in php.ini

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多