time_nanosleep
(PHP 5, PHP 7, PHP 8)
time_nanosleep — 秒およびナノ秒単位で実行を遅延する
説明
指定した seconds
および
nanoseconds
の時間だけプログラムの実行を遅延させます。
パラメータ
seconds
-
非負の整数である必要があります。
nanoseconds
-
十億よりも小さい非負の整数である必要があります。
注意: Windows では、与えられたナノ秒以上に長くスリープする可能性があります。 動作はハードウェア依存です。
戻り値
成功した場合に true
を、失敗した場合に false
を返します。
シグナルによって遅延処理が中断された場合、以下の要素からなる連想配列を返します。
-
seconds
- 残りの秒数 -
nanoseconds
- 残りのナノ秒数
例
例1 time_nanosleep() の例
<?php
// 注意! もし配列が返された場合、これはうまく動作しません
if (time_nanosleep(0, 500000000)) {
echo "0.5 秒遅延しました。\n";
}
// こちらのほうがよいでしょう
if (time_nanosleep(0, 500000000) === true) {
echo "0.5 秒遅延しました。\n";
}
// そしてこれが最良の方法です
$nano = time_nanosleep(2, 100000);
if ($nano === true) {
echo "2 秒と 100 マイクロ秒だけ遅延しました。\n";
} elseif ($nano === false) {
echo "遅延に失敗しました。\n";
} elseif (is_array($nano)) {
$seconds = $nano['seconds'];
$nanoseconds = $nano['nanoseconds'];
echo "シグナルによって中断しました。\n";
echo "残りの秒数は $seconds 秒と $nanoseconds ナノ秒です。";
}
?>
参考
- sleep() - 実行を遅延させる
- usleep() - マイクロ秒単位で実行を遅延する
- time_sleep_until() - 指定した時刻まで実行を遅延する
- set_time_limit() - 実行時間の最大値を制限する
+add a note
User Contributed Notes 4 notes
m at kufi dot net ¶
19 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.";
?>
anybody (a) emuxperts.net ¶
18 years ago
Documentation states that "seconds" must be positive. This is not correct, 0 is possible.
Rather, "seconds" must be non-negative.
fantasysportswire at yahoo dot com ¶
18 years ago
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 :( .....
b dot andrew at shaw dot ca ¶
16 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!
↑ and ↓ to navigate •
Enter to select •
Esc to close
Press Enter without
selection to search using Google