PHP`time_sleep_until()`在指定时间之前不会休眠

时间:2017-04-19 15:17:07

标签: php datetime

在我的机器上,PHP程序

<?php
$now= time();
echo "Now:        ".$now."\n";
$waituntil= $now+5;
echo "Wait until: ".$waituntil."\n";
time_sleep_until($waituntil);
echo "Now:        ".time()."\n";
?>

产生输出,例如

Now:        1492614718
Wait until: 1492614723
Now:        1492614722

现在我想知道为什么time_sleep_until函数没有等到指定的时间(它总是在指定时间之前持续一秒)。

如何实现程序等到指定的linux时间戳?

编辑: 我添加了microtime(true),现在得到以下结果:

<?php
$now= time();
$nowmicro= microtime(true);
echo "Now:        ".$now."\n";
echo "Now micro:  ".$nowmicro."\n";
$waituntil= $now+5;
echo "Wait until: ".$waituntil."\n";
time_sleep_until($waituntil);

$now= time();
$nowmicro= microtime(true);
echo "Now:        ".$now."\n";
echo "Now micro:  ".$nowmicro."\n";
?>

产生

Now:        1492616333
Now micro:  1492616333.1153
Wait until: 1492616338
Now:        1492616337
Now micro:  1492616338.0001

3 个答案:

答案 0 :(得分:2)

time_sleep_until使用microtime。如果您使用microtime(true)代替time(),您将获得正确的结果:

Now:        1492615646.9312
Wait until: 1492615651.9312
Now:        1492615651.9313

time()microtime()不同,请点击此处了解详情:https://stackoverflow.com/a/11890155/994054

证明:

...
time_sleep_until($waituntil);
echo "Now:        ".microtime(true)."\n";
echo "Now:        ".time()."\n";

给了我

Wait until: 1492615871
Now:        1492615871.0001
Now:        1492615870

我不知道time()使用time_sleep_until后给出不同结果的确切原因,您必须深入研究PHP C代码

值得一提的是time_sleep_until() usleep

的替代方案

答案 1 :(得分:1)

我自己运行,得到以下结果:

Now: 1492615301 
Wait until: 1492615306 
Now: 1492615306

你在运行什么PHP版本?据我所知,在早期版本(5.3之前的版本)中,这个功能在Windows上效果不佳

答案 2 :(得分:0)

也许,更好的解决方案是使用sleep函数设置超时?您可以找到更多here

因此,您的代码将如下所示:

<?php
$now= time();
echo "Now: $now".PHP_EOL;
$sleepTimeout= 5;
echo "Sleep timeout: $sleepTimeout".PHP_EOL;
sleep($sleepTimeout);
echo "Time after sleep: ".time().PHP_EOL;
?>

的问候。