PHP 5.6.0 released

time_sleep_until

(PHP 5 >= 5.1.0)

time_sleep_until Hacer que el script duerma hasta el momento especificado

Descripción

bool time_sleep_until ( float $timestamp )

Hace que el script duerma hasta la marca de tiempo especificada dada por timestamp.

Parámetros

timestamp

La marca de tiempo en la que el script debería despertar.

Valores devueltos

Devuelve TRUE en caso de éxito o FALSE en caso de error.

Historial de cambios

Versión Descripción
5.3.0 Esta función ahora está disponible en plataformas Windows.

Errores/Excepciones

Si la timestamp especificada está en el pasado, esta función generará un error de nivel E_WARNING.

Ejemplos

Ejemplo #1 Un ejemplo de time_sleep_until()

<?php

//devuelve false y genera una advertencia
var_dump(time_sleep_until(time()-1));

// puede funcionar solamente en ordenadores más rápidos, dormará durante 0.2 segundos
var_dump(time_sleep_until(microtime(true)+0.2));

?>

Notas

Nota: Todas las señales serán emitidas después de que despierte el script.

Ver también

add a note add a note

User Contributed Notes 3 notes

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
1
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
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