【问题标题】:why is time()-$_SERVER["REQUEST_TIME_FLOAT"] off by 1 second in php-cli?为什么 time()-$_SERVER["REQUEST_TIME_FLOAT"] 在 php-cli 中关闭 1 秒?
【发布时间】:2019-06-29 07:15:36
【问题描述】:

在 windows 上运行 php-cli 版本 7.3.4,在 linux 上运行 7.3.6,等式time()-$_SERVER["REQUEST_TIME_FLOAT"] 似乎相当一致地缩短了 1 秒.. 为什么?运行php -r 'sleep(4);var_dump(time()-$_SERVER["REQUEST_TIME_FLOAT"]);',我得到数字 3.X,我希望这总是返回一个数字 >=4,为什么我得到 3.x 数字?

hans@hans-lp17 ~
$ php -r 'sleep(4);var_dump(getrusage()["ru_utime.tv_sec"]);var_dump(time()-$_SERVER["REQUEST_TIME_FLOAT"]);'
int(0)
float(3.1129999160767)

hans@hans-lp17 ~
$ php -r 'sleep(4);var_dump(getrusage()["ru_utime.tv_sec"]);var_dump(time()-$_SERVER["REQUEST_TIME_FLOAT"]);'
int(0)
float(3.3659999370575)

hans@hans-lp17 ~
$ php -r 'sleep(4);var_dump(time()-$_SERVER["REQUEST_TIME_FLOAT"]);'
float(3.3789999485016)

hans@hans-lp17 ~
$ php -r 'sleep(4);var_dump(time()-$_SERVER["REQUEST_TIME_FLOAT"]);'
float(3.664999961853)

hans@hans-lp17 ~
$ php -r 'sleep(4);var_dump(time()-$_SERVER["REQUEST_TIME_FLOAT"]);'
float(3.3450000286102)

hans@hans-lp17 ~
$ php -r 'function f(){sleep(4);var_dump(time()-$_SERVER["REQUEST_TIME_FLOAT"]);}f();'
float(3.2279999256134)

hans@hans-lp17 ~
$ php -r 'function f(){sleep(4);var_dump(time()-$_SERVER["REQUEST_TIME_FLOAT"]);}f();'
float(3.0420000553131)

hans@hans-lp17 ~
$ php -r 'function f(){sleep(4);var_dump(time()-$_SERVER["REQUEST_TIME_FLOAT"]);}f();'
float(3.539999961853)

hans@hans-lp17 ~
$ php -r 'function f(){sleep(4);var_dump(time()-$_SERVER["REQUEST_TIME_FLOAT"]);}f();f();'
float(3.0999999046326)
float(7.0999999046326)

【问题讨论】:

    标签: php time


    【解决方案1】:

    .. 显然这是一个精度和舍入问题,$_SERVER["REQUEST_TIME_FLOAT"] 具有微秒精度,而 time() 的精度比这低 1000000 倍,使用 microtime(true) 代替,我们得到:

    hans@hans-lp17 ~
    $ php -r 'sleep(4);var_dump(microtime(true)-$_SERVER["REQUEST_TIME_FLOAT"]);'
    float(4)
    
    hans@hans-lp17 ~
    $ php -r 'sleep(4);var_dump(microtime(true)-$_SERVER["REQUEST_TIME_FLOAT"]);'
    float(4)
    
    hans@hans-lp17 ~
    $ php -r 'sleep(4);var_dump(microtime(true)-$_SERVER["REQUEST_TIME_FLOAT"]);'
    float(4.0009999275208)
    
    hans@hans-lp17 ~
    $ php -r 'sleep(4);var_dump(microtime(true)-$_SERVER["REQUEST_TIME_FLOAT"]);'
    float(4.0009999275208)
    

    【讨论】:

    • 否:time()可以理解为microtime( TRUE )的截断版。一次输出两个函数的结果,你会看到的。这也是合乎逻辑的:如果time() 会被围捕,我会活在未来。
    • 把它想象成一个没有秒的数字时钟。在23:59:59 它仍然显示23:59
    猜你喜欢
    • 2014-08-17
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2020-04-28
    • 1970-01-01
    相关资源
    最近更新 更多