Just glancing at this - and the note from over a year ago with a implementation for windows.. with 5.0.0 and higher it would be simplier to just do something like......
<?php
if (!function_exists('time_nanosleep')) {
function time_nanosleep($seconds, $nanoseconds) {
sleep($seconds);
usleep(round($nanoseconds/100));
return true;
}
}
?>
....off the top of my head - obviously simple enough there should be no mistakes.. but those are the ones that always seem to get ya :( .....
time_nanosleep
(PHP 5)
time_nanosleep — Verzögert die Ausführung um die gegebene Anzahl Sekunden und Nanosekunden
Beschreibung
Verzögert die Ausführung für die gegebene Anzahl
seconds und nanoseconds.
Parameter-Liste
-
seconds -
Ein positiver Integerwert.
-
nanoseconds -
Ein positiver Integerwert kleiner als eine Milliarde.
Rückgabewerte
Gibt bei Erfolg TRUE zurück. Im Fehlerfall wird FALSE zurückgegeben.
Wenn die Verzögerung durch ein Signal unterbrochen wurde wird ein Array mit den folgenden Werten zurückgegeben:
- seconds - die verbleibenden Sekunden
- nanoseconds - die verbleibenden Nanosekunden
Changelog
| Version | Beschreibung |
|---|---|
| 5.3.0 | Diese Funktion ist nun auch unter Windows verfügbar. |
Beispiele
Beispiel #1 time_nanosleep() Beispiel
<?php
// Vorsicht! Verhält sich nicht wie erwartet wenn ein Array
// zurückgegeben wird
if (time_nanosleep(0, 500000000)) {
echo "Verzögerung um eine halbe Sekunden.\n";
}
// Dies ist besser:
if (time_nanosleep(0, 500000000) === true) {
echo "Verzögerung um eine halbe Sekunden.\n";
}
// Optimal ist:
$nano = time_nanosleep(2, 100000);
if ($nano === true) {
echo "Verzögert um 2 Sekunden und 100 Millisekunden.\n";
} elseif ($nano === false) {
echo "Keine Verzögerung.\n";
} elseif (is_array($nano)) {
$seconds = $nano['seconds'];
$nanoseconds = $nano['nanoseconds'];
echo "Von einem Signal unterbrochen.\n";
echo "Verbleibende Verzögerung: $seconds Sekunden, $nanoseconds Nanosekunden.";
}
?>
Siehe auch
- sleep() - Programmverzögerung
- usleep() - Programm-Verzögerung in Mikrosekunden
- time_sleep_until() - Lässt das Skript bis zur angegebenen Zeit schlafen
- set_time_limit() - Legt die maximale Ausführungszeit fest
fantasysportswire at yahoo dot com ¶
6 years ago
m at kufi dot net ¶
7 years ago
You should take into account, if you use the function replacement down here, the CPU will be in use of 99% for the time of execution...
(A little bit better in this situation is to let the 'full seconds' go by a normal sleep command (makes the thread sleep!, and uses minimum cpu))
<?php
//THIS IS THE FUNCTION WE ARE TALKIN ABOUT
function timeWait($microtime)
{
//optimizations added by me [start]
//sleep the full seconds
sleep(intval($microtime));
//set the microtime to only resleep the last part of the nanos
$microtime = $microtime - intval($microtime);
//optimizations added by me [end]
$timeLimit = $microtime + array_sum(explode(" ",microtime()));
while(array_sum(explode(" ",microtime())) < $timeLimit)
{/*DO NOTHING*/}
return(true);
}
//THIS IS HOW WE CAN USE IT
echo "Process started at " . date("H:i:s") . " and " . current(explode(" ",microtime())) . " nanoseconds.<br>";
timeWait(5.5); //With this call the system will wait 5 seconds and a half. You can use either integer or float.
echo "Process completed at " . date("H:i:s") . " and " . current(explode(" ",microtime())) . " nanoseconds.";
?>
b dot andrew at shaw dot ca ¶
4 years ago
A response to the note below:
Your function is also useless, as the WinNT 32 kernel only functions at a minimum of about 10+ ms (1,000 us), rendering usleep() useless, because usleep uses the C function which is provided by the system (in this case, kernel32.dll).
You'll want to use a function that does not rely on the kernel, but rather something made for precise measurement:
<?php
function usleep_win( $micro_seconds )
{
if ( @function_exists( "socket_create" ) && @function_exists( "socket_select" ) )
{
$false = NULL;
$socket = array( socket_create( AF_INET, SOCK_RAW, $false ) );
socket_select( $false, $false, $socket, 0, $micro_seconds );
return true;
}
else
{
return false;
}
}
?>
This function will allow to you sleep for a specified microsecond, although I have measured it to be off by ~5 us.
Again, most of this depends on the hardware in your system. If you _REALLY_ need to be precise to < 10 us, you shouldn't be using WinNT anyways!
anybody (a) emuxperts.net ¶
6 years ago
Documentation states that "seconds" must be positive. This is not correct, 0 is possible.
Rather, "seconds" must be non-negative.
tecnomaniac at ig dot com dot br ¶
7 years ago
This is an alternative function to sleep_nanosecond that you can use with PHP versions below PHP 5.0. It is not very accurate if we talk about nanoseconds but the results are satisfatory. Enjoy!
<?php
//THIS IS THE FUNCTION WE ARE TALKIN ABOUT
function timeWait($microtime)
{
$timeLimit = $microtime + array_sum(explode(" ",microtime()));
while(array_sum(explode(" ",microtime())) < $timeLimit)
{/*DO NOTHING*/}
return(true);
}
//THIS IS HOW WE CAN USE IT
echo "Process started at " . date("H:i:s") . " and " . current(explode(" ",microtime())) . " nanoseconds.<br>";
timeWait(5.5); //With this call the system will wait 5 seconds and a half. You can use either integer or float.
echo "Process completed at " . date("H:i:s") . " and " . current(explode(" ",microtime())) . " nanoseconds.";
?>
