©
Ce document utilise Manuel du site Web PHP chinois Libérer
(PHP 5 >= 5.1.0)
time_sleep_until — 使脚本睡眠到指定的时间为止。
$timestamp
)
使脚本睡眠到指定的
timestamp
。
timestamp
将脚本唤醒的时间戳。
成功时返回 TRUE
, 或者在失败时返回 FALSE
。
版本 | 说明 |
---|---|
5.3.0 | 自此,函数在Windows平台可用。 |
如果设定的 timestamp
为过去的时间,脚本将会产生一个 E_WARNING
级别的错误。
Example #1 time_sleep_until() 的一个例子
<?php
//returns false and generates a warning
var_dump ( time_sleep_until ( time ()- 1 ));
// may only work on faster computers, will sleep up to 0.2 seconds
var_dump ( time_sleep_until ( microtime ( true )+ 0.2 ));
?>
Note: 所有的信号会被延迟至脚本唤醒以后。
[#1] rowan dot collins at cwtdigital dot com [2012-05-30 10:42:29]
Not realising that this function existed, I wrote something similar, but it has the additional facility to specify a minimum pause even if the target time has already been reached, for instance in a processor-intensive loop.
It's in seconds rather than microseconds (it's intended for heavy-duty CLI scripts), but that could easily be changed by using microtime(true) and usleep if greater granularity was required.
<?php
function sleep_until($target_time, $min_sleep = 0)
{
$time_now = time();
$time_to_target = $target_time - $time_now;
// If we've already reached the target time, that's fine
if ( $time_to_target <= $min_sleep )
{
// If required, sleep for a bit anyway
sleep( $min_sleep );
}
else
{
// Sleep for the number of seconds until the target time
sleep( $time_to_target );
}
}
?>
[#2] purdue at nc dot rr dot com [2011-05-05 11:04:28]
At least on my Windows machine, the time_sleep_until function appears to calculate the number of microseconds between now and the sleep-until timestamp, and it appears to use unsigned 32-bit math in this calculation. This roundoff leads to a maximum sleep time of just under 4295 seconds (1 hour, 11 minutes, 35 seconds). To get longer sleep times, while still using time_sleep_until to minimize processor overhead, the following loop may be some help to you:
<?php
$sleepuntil = strtotime("tuesday 3pm");
while (time() < $sleepuntil)
time_sleep_until($sleepuntil);
// proceed with dated processing
?>
Of course, one could use something like "cron" instead, to avoid the script doing the extended sleep. Also note that time_nanosleep appears to do similar math, but it is somewhat more intuitive that the seconds parameter has an upper limit on what it can be. Still, both functions might report a warning when waking up prematurely due to roundoff.
[#3] roberto at spadim dot com dot br [2006-12-16 07:05:08]
better implementation
<?php
if (!function_exists('time_sleep_until')) {
function time_sleep_until($future) {
if ($future < time()) {
trigger_error("Time in past", E_USER_WARNING);
return false;
}
usleep(($future - microtime(1))*1000000);
return true;
}
}
?>