time_sleep_until

(PHP 5 >= 5.1.0)

time_sleep_until 指定した時刻まで実行を遅延する

説明

bool time_sleep_until ( float $timestamp )

指定した timestamp までスクリプトの実行を遅延させます。

パラメータ

timestamp

スクリプトが再開する時刻。

返り値

成功した場合に TRUE を、失敗した場合に FALSE を返します。

変更履歴

バージョン 説明
5.3.0 この関数は Windows プラットフォームでも使用可能となりました。

エラー / 例外

過去の timestamp を指定した場合、この関数は E_WARNING を発生させます。

例1 time_sleep_until() の例

<?php

// false を返し、警告を発生します
var_dump(time_sleep_until(time()-1));

// 高速なコンピュータ上でのみ動作します。実行を 0.2 秒遅延します。
var_dump(time_sleep_until(microtime(true)+0.2));

?>

注意

注意: すべてのシグナルは、スクリプトが再開した後で送信されます。

参考

add a note add a note

User Contributed Notes 3 notes

up
2
purdue at nc dot rr dot com
3 years ago
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.
up
2
rowan dot collins at cwtdigital dot com
2 years ago
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
   
/**
     * Pause processing until the specified time, to avoid hammering a DB or service
     *
     * @param int $target_time Timestamp
     * @param int $min_sleep Always sleep for a minimum number of seconds,
     *    even if the target timestamp has already passed.
     *     Default 0, meaning only sleep until the target timestamp is reached.
     *
     * @example <code>
         while ( ! $finished )
         {
             $minimum_start_of_next_loop = time() + $min_secs_per_loop;
            
             # DO STUFF THAT MAY OR MAY NOT TAKE VERY LONG
            
             sleep_until( $minimum_start_of_next_loop, $min_pause_between_loops );
         }
     </code>
     */
   
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 );
        }
    }
?>
up
0
roberto at spadim dot com dot br
7 years ago
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;
   }
}
?>
To Top