Wall clock(time) VS Monotonic clock(time)
Wall clock(time)就是我们一般意义上的时间,就像墙上钟所指示的时间。
Monotonic clock(time)字面意思是单调时间,实际上它指的是从某个点开始后(比如系统启动以后)流逝的时间,jiffies一定是单调递增的!
而特别要强调的是计算两个时间点的差值一定要用Monotonic clock(time),因为Wall clock(time)是可以被修改的,比如计算机时间被回拨(比如校准或者人工回拨等情况),或者闰秒( leap second),会导致两个wall clock(time)可能出现负数。(因为操作系统或者上层应用不一定完全支持闰秒,出现闰秒后系统时间会在后续某个点会调整为正确值,就有可能出现时钟回拨(当然也不是一定,比如ntpdate就有可能出现时钟回拨,但是ntpd就不会))
PHP 7.3新增了hrtime函数
hrtime ([ bool $get_as_number = FALSE ] ) : mixed
Returns the system’s high resolution time, counted from an arbitrary point in time. The delivered timestamp is monotonic and can not be adjusted.
<?php while(true){ var_dump(time()); // $micro = microtime(true); // var_dump($micro); // echo PHP_EOL; //var_dump(hrtime()); $nanosecond = hrtime(true); var_dump($nanosecond/1000/1000/1000);//nanosecond => second echo PHP_EOL; echo PHP_EOL; echo PHP_EOL; echo PHP_EOL; sleep(5); }
执行此脚本,然后在过程中手动更改系统时间。执行结果如下
……
int(1554975423)
float(481987.58385405)
int(1554975428)
float(481992.58812)
int(1554975433) ==> 北京时间:2019/4/11 17:37:13
float(481997.59318082)
int(1554889031) ==> 北京时间:2019/4/10 17:37:11
float(482002.59569814)
int(1554889036)
float(482007.59825222)
……
hrtime()的返回值就是一直单调递增的,而time()的返回值就可能出现跳跃。所以在计算时间差时要用hrtime(),注意PHP版本至少要7.3 。