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 程序的執行節奏,提升定時任務的準確性和穩定性。