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)
现在,这只是一个小差距; 然而,我观察到一些系列的差异(相当)超过一秒...所以,这怎么可能?
如果你看一下的实现time和microtime,你看他们是完全不同的:
time只需调用C time函数.microtime有两个实现:如果C函数gettimeofday可用(它应该在Linux系统上),它就是直接调用的.否则他们会拉一些杂技来使用rusage来计算时间.由于C time调用仅精确到一秒,因此它也可能故意使用低保真时间源.
此外,在现代x86_64系统上,通过查看某些CPU寄存器,可以在没有系统调用的情况下实现这两个C函数.如果您使用的是多核系统,则这些寄存器可能与核心不完全匹配,这可能是一个原因.
造成差异的另一个可能原因是NTPd(一个计时守护进程)或其他一些用户空间进程正在改变时钟.通常,应该避免这些影响adjtime.
所有这些理由都非常深奥.要进一步调试问题,您应该: