©
本文档使用 PHP中文网手册 发布
(PHP 5)
time_nanosleep — 延缓执行若干秒和纳秒
$seconds
, int $nanoseconds
)
程序延缓执行指定数量的 seconds
和 nanoseconds
。
seconds
必须是一个非负整数。
nanoseconds
必须是一个小于1亿的非负整数。
成功时返回 TRUE
, 或者在失败时返回 FALSE
。
如果延迟被中断,一个关联数组会返回,内容为:
版本 | 说明 |
---|---|
5.3.0 | 至此之后该函数在Windows平台下可用。 |
Example #1 time_nanosleep() 的例子
<?php
// Careful! This won't work as expected if an array is returned
if ( time_nanosleep ( 0 , 500000000 )) {
echo "Slept for half a second.\n" ;
}
// This is better:
if ( time_nanosleep ( 0 , 500000000 ) === true ) {
echo "Slept for half a second.\n" ;
}
// And this is the best:
$nano = time_nanosleep ( 2 , 100000 );
if ( $nano === true ) {
echo "Slept for 2 seconds, 100 microseconds.\n" ;
} elseif ( $nano === false ) {
echo "Sleeping failed.\n" ;
} elseif ( is_array ( $nano )) {
$seconds = $nano [ 'seconds' ];
$nanoseconds = $nano [ 'nanoseconds' ];
echo "Interrupted by a signal.\n" ;
echo "Time remaining: $seconds seconds, $nanoseconds nanoseconds." ;
}
?>
[#1] b dot andrew at shaw dot ca [2008-07-04 21:10:05]
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!
[#2] fantasysportswire at yahoo dot com [2006-12-18 15:27:02]
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 :( .....
[#3] anybody (a) emuxperts.net [2006-08-21 16:03:50]
Documentation states that "seconds" must be positive. This is not correct, 0 is possible.
Rather, "seconds" must be non-negative.
[#4] m at kufi dot net [2005-08-13 14:03:19]
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)
{}
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.";
?>
[#5] tecnomaniac at ig dot com dot br [2005-07-26 15:04:58]
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)
{}
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.";
?>