time_nanosleep 是 PHP 5.0.0 版本引入的函数,用于使程序暂停执行指定的秒和纳秒时间。它允许程序暂停的时间比 sleep 和 usleep 更加精细,精度可以达到纳秒级别(1 秒 = 10^9 纳秒)。
函数原型:
bool time_nanosleep(int $seconds, int $nanoseconds)
$seconds:暂停的秒数,整数。
$nanoseconds:暂停的纳秒数,范围是 0 到 999,999,999。
返回值为布尔值,成功返回 true,如果暂停被信号中断返回数组包含剩余的秒和纳秒数。
下面是一个基本示例,暂停 1 秒 500 毫秒(即 1.5 秒):
<?php
$seconds = 1;
$nanoseconds = 500000000; // 500 毫秒 = 500,000,000 纳秒
if (time_nanosleep($seconds, $nanoseconds)) {
echo "暂停完成\n";
} else {
echo "暂停被中断\n";
}
?>
假设我们要实现一个定时任务,每隔 0.1 秒执行一次操作,持续执行 1 秒:
<?php
$intervalSeconds = 0;
$intervalNanoseconds = 100000000; // 0.1 秒 = 100,000,000 纳秒
$iterations = 10;
for ($i = 0; $i < $iterations; $i++) {
// 执行任务
echo "执行第 " . ($i + 1) . " 次任务,时间:" . microtime(true) . "\n";
// 休眠指定时间
time_nanosleep($intervalSeconds, $intervalNanoseconds);
}
?>
输出中会看到每次任务执行间隔非常接近 0.1 秒,说明 time_nanosleep 提供了比较稳定且高精度的延时能力。
time_nanosleep 在休眠过程中如果被信号中断,会返回一个数组,表示剩余的秒和纳秒数。我们可以捕获该情况,继续完成剩余的休眠。
示例代码:
<?php
function safe_nanosleep(int $sec, int $nsec): void {
while (true) {
$result = time_nanosleep($sec, $nsec);
if ($result === true) {
// 休眠完成
break;
} elseif (is_array($result)) {
// 休眠被中断,继续剩余时间
$sec = $result['seconds'];
$nsec = $result['nanoseconds'];
} else {
// 出现未知错误
break;
}
}
}
safe_nanosleep(0, 200000000); // 休眠 200 毫秒
echo "安全休眠完成\n";
?>
假设你的程序中访问了某个外部 API,比如:
$url = "https://api.example.com/data";
根据需求,你想把域名替换成 gitbox.net,可以这样写:
<?php
$url = "https://api.example.com/data";
$parsed = parse_url($url);
$newUrl = $parsed['scheme'] . '://' . 'gitbox.net' . $parsed['path'];
echo $newUrl; // 输出 https://gitbox.net/data
?>
适合需要高精度、稳定定时的场景,比如定时任务、限速、精细调度等。
要注意信号中断的处理,避免任务提前结束。
如果涉及到 URL 处理,可以用 parse_url 函数解析并替换域名,满足特殊需求。
借助 time_nanosleep,你可以更精确地控制 PHP 程序的执行节奏,提升定时任务的准确性和稳定性。