PHP Conference Japan 2024

time_sleep_until

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

time_sleep_until使脚本休眠至指定时间

描述

time_sleep_until(float $timestamp): bool

使脚本休眠至指定的 timestamp

参数

timestamp

脚本应唤醒的时间戳。

返回值

成功时返回 true,失败时返回 false

错误/异常

如果指定的 timestamp 在过去,此函数将生成一个 E_WARNING

范例

示例 #1 time_sleep_until() 示例

<?php

// 返回 false 并生成警告
var_dump(time_sleep_until(time()-1));

// 仅可能在较快的计算机上工作,将休眠最多 0.2 秒
var_dump(time_sleep_until(microtime(true)+0.2));

?>

注释

注意: 所有信号将在脚本唤醒后传递。

参见

添加注释

用户贡献的注释 3 条注释

purdue at nc dot rr dot com
13 年前
至少在我的 Windows 计算机上,time_sleep_until 函数似乎计算了现在到休眠时间戳之间的微秒数,并且它似乎在此计算中使用了无符号 32 位数学。此舍入导致最大休眠时间仅略低于 4295 秒(1 小时 11 分 35 秒)。为了获得更长的休眠时间,同时仍然使用 time_sleep_until 来最大程度地减少处理器开销,以下循环可能对您有所帮助

<?php

$sleepuntil
= strtotime("tuesday 3pm");

while (
time() < $sleepuntil)
time_sleep_until($sleepuntil);

// 继续进行日期处理

?>

当然,可以使用类似“cron”的东西来避免脚本执行扩展休眠。另请注意,time_nanosleep 似乎执行类似的数学运算,但秒参数具有上限,这在某种程度上更直观。尽管如此,这两个函数在由于舍入过早唤醒时都可能会报告警告。
rowan dot collins at cwtdigital dot com
12 年前
没有意识到这个函数的存在,我写了一些类似的东西,但它还具有指定最小暂停的功能,即使目标时间已经过去,例如在处理器密集型循环中。

它是以秒而不是微秒为单位(它适用于重型 CLI 脚本),但如果需要更高的粒度,可以通过使用 microtime(true) 和 usleep 轻松更改。

<?php
/**
* 暂停处理直到指定时间,以避免猛击数据库或服务
*
* @param int $target_time 时间戳
* @param int $min_sleep 始终休眠最少秒数,
* 即使目标时间戳已经过去。
* 默认值为 0,表示仅休眠直到达到目标时间戳。
*
* @example <code>
while ( ! $finished )
{
$minimum_start_of_next_loop = time() + $min_secs_per_loop;

# 执行可能需要很长时间也可能不需要很长时间的操作

sleep_until( $minimum_start_of_next_loop, $min_pause_between_loops );
}
</code>
*/
function sleep_until($target_time, $min_sleep = 0)
{
$time_now = time();

$time_to_target = $target_time - $time_now;

// 如果我们已经达到目标时间,那就没问题
if ( $time_to_target <= $min_sleep )
{
// 如果需要,无论如何都要休眠一段时间
sleep( $min_sleep );
}
else
{
// 休眠直到目标时间的秒数
sleep( $time_to_target );
}
}
?>
divinity76 at gmail dot com
5 年前
如果您出于某种原因需要 realpath() 的恒定时间实现,请尝试

<?php

function realpath_constant_time(string $path, float $target_seconds, bool &$constant_time_success = null){
$start_time=microtime(true);
$ret=realpath($path);
$constant_time_success = @time_sleep_until($start_time+$target_seconds);
return
$ret;
}
?>

例如,一个始终使用正好 1 毫秒的实时(对于基于 SSD 的服务器来说应该绰绰有余,也许基于旋转硬盘的服务器可能需要接近 10 毫秒的东西,我不知道)

<?php
realpath_constant_time
("/path/to/../to/file.txt",0.001,$constant_time_success);
?>

您可以使用 $constant_time_success 来查看是否需要更多时间(因此无法以恒定时间执行 realpath()),或者是否成功。
To Top