PHP Conference Japan 2024

time_nanosleep

(PHP 5, PHP 7, PHP 8)

time_nanosleep延遲指定的秒數和奈秒數

說明

time_nanosleep(int $seconds, int $nanoseconds): array|bool

延遲程式執行指定的 秒數奈秒數

參數

seconds

必須是非負整數。

nanoseconds

必須是非負整數,且小於 10 億。

注意在 Windows 系統上,根據硬體的不同,系統的睡眠時間可能會比指定的奈秒數更長。

傳回值

成功時傳回 true,失敗時傳回 false

如果延遲被信號中斷,將會傳回一個關聯式陣列,包含以下元素:

  • seconds - 延遲剩餘的秒數
  • nanoseconds - 延遲剩餘的奈秒數

範例

範例 #1 time_nanosleep() 範例

<?php
// 注意!如果傳回的是陣列,這段程式碼將無法如預期般運作
if (time_nanosleep(0, 500000000)) {
echo
"已睡眠半秒。\n";
}

// 這樣寫比較好:
if (time_nanosleep(0, 500000000) === true) {
echo
"已睡眠半秒。\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 奈秒。";
}
?>

參見

新增註解

使用者貢獻的註解 4 則註解

m at kufi dot net
19 年前
如果您使用下方的函式替代方案,您應該考慮到 CPU 將在執行期間占用 99% 的使用率...

(在這種情況下,稍微好一點的做法是讓「完整的秒數」通過正常的 sleep 命令(使執行緒休眠!,並且使用最少的 CPU))

<?php
//我們正在討論的函式
function timeWait($microtime)
{
//我新增的優化 [開始]
//完整秒數休眠
sleep(intval($microtime));
//設定 microtime 只重新休眠奈秒的最後一部分
$microtime = $microtime - intval($microtime);
//我新增的優化 [結束]

$timeLimit = $microtime + array_sum(explode(" ",microtime()));
while(
array_sum(explode(" ",microtime())) < $timeLimit)
{
/*不做任何事*/}
return(
true);
}

//使用方法
echo "程序開始於 " . date("H:i:s") . " 以及 " . current(explode(" ",microtime())) . " 奈秒.<br>";
timeWait(5.5); //呼叫此函式系統將等待 5 秒半。您可以使用整數或浮點數。
echo "程序完成於 " . date("H:i:s") . " 以及 " . current(explode(" ",microtime())) . " 奈秒.";
?>
anybody (a) emuxperts.net
18 年前
文件說明「秒數」必須為正數。這不正確,0 是可以的。

更確切地說,「秒數」必須是非負數。
fantasysportswire at yahoo dot com
17 年前
只是稍微看一下這個 - 以及一年多前關於 Windows 實作的注意事項.. 使用 5.0.0 及更高版本,可以更簡潔地做到類似......

<?php

if (!function_exists('time_nanosleep')) {

function
time_nanosleep($seconds, $nanoseconds) {

sleep($seconds);
usleep(round($nanoseconds/100));

return
true;

}

}

?>

....這是我的初步想法 - 顯然很簡單,應該沒有錯誤.. 但這些錯誤總是看起來會讓你困擾 :( .....
b dot andrew at shaw dot ca
16 年前
回覆以下的說明

你的函式也沒有用,因為 WinNT 32 核心運作的最小單位大約是 10+ 毫秒 (1,000 微秒),這使得 usleep() 函式形同虛設,因為 usleep() 使用的是系統提供的 C 函式 (在這個例子中是 kernel32.dll)。

你應該使用不依賴核心,而是專為精確測量設計的函式。

<?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;
}
}
?>

這個函式可以讓你程式休眠指定的微秒數,雖然我測量到它會有大約 5 微秒的誤差。

再次強調,這大部分取決於你系統的硬體。如果你*真的*需要精確到小於 10 微秒,你根本不應該使用 WinNT!
To Top