time_nanosleep

(PHP 5, PHP 7, PHP 8)

time_nanosleep延迟指定秒数和纳秒数

说明

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

将程序执行延迟指定数量的 secondsnanoseconds

参数

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 纳秒。";
}
?>

参见

添加注释

用户贡献的注释 5 则注释

m at kufi dot net
19 年前
您应该考虑到,如果您使用下面的函数替换,CPU 将在执行期间占用 99% 的时间...

(在这种情况下,让“完整秒”通过正常的 sleep 命令(使线程休眠!并使用最少的 CPU)会稍微好一些)

<?php
// 这是我们正在讨论的函数
function timeWait($microtime)
{
// 我添加的优化 [开始]
// 休眠完整秒
sleep(intval($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
17 年前
文档中指出“seconds”必须为正数。这是不正确的,0 是可能的。

相反,“seconds”必须是非负数。
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 了!
tecnomaniac at ig dot com dot br
19 年前
这是一个 sleep_nanosecond 函数的替代函数,你可以在 PHP 5.0 以下版本中使用它。如果我们谈论的是纳秒,它并不十分准确,但结果令人满意。享受!

<?php
// 这是我们谈论的函数
function timeWait($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())) . " 纳秒。";
?>
To Top