PHP Conference Japan 2024

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

参见

添加注释

用户贡献的注释 4 条注释

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
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