首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP time_nanosleep() 高精度延遲函數詳解與使用示例

     編輯:PHP 相關知識

函數原型

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

參數說明

參數類型範圍說明
secondsint≥ 0延遲秒數
nanosecondsint0 ~ 999,999,999延遲納秒數 (1 秒 = 109 納秒)

返回值

  • 成功:返回 true
  • 失敗:返回 false (參數無效)
  • 被信號中斷:返回關聯數組 ['seconds' => 剩餘秒, 'nanoseconds' => 剩餘納秒]

平台支持

⚠ Windows 不支持:time_nanosleep() 僅在 Linux/Unix/macOS 等 POSIX 系統可用。Windows 下調用會報錯 Call to undefined function time_nanosleep()。

基本示例

<?php
// 延遲 3.5 秒 (3 秒 + 500,000,000 納秒)
if (time_nanosleep(3, 500000000) === true) {
    echo "暫停 3.5 秒完成\n";
}

// 精確延遲 100 毫秒
time_nanosleep(0, 100000000);

// 處理信號中斷
$remain = time_nanosleep(10, 0);
if (is_array($remain)) {
    echo "被中斷,剩餘 {$remain['seconds']} 秒 {$remain['nanoseconds']} 納秒\n";
    // 可選:繼續睡眠剩餘時間
    time_nanosleep($remain['seconds'], $remain['nanoseconds']);
}
?>

對比:sleep / usleep / time_nanosleep

函數精度參數跨平台典型用途
sleep()秒int 秒數✅ 全平台簡單秒級延遲
usleep()微秒int 微秒數 (最大 1,000,000)✅ 全平台亞秒級延遲
time_nanosleep()納秒秒 + 納秒❌ 僅 POSIX高精度定時、科學計算、實時系統
hrtime() (PHP 7.3+)納秒獲取高精度時間戳✅ 全平台性能測量、基準測試

實戰:精確速率限制器

<?php
class RateLimiter {
    private $intervalNs; // 納秒間隔

    public function __construct(float $maxPerSecond) {
        $this->intervalNs = (int)(1_000_000_000 / $maxPerSecond);
    }

    public function wait() {
        static $lastTime = 0;
        $now = hrtime(true); // 納秒級單調時鐘
        $elapsed = $now - $lastTime;
        if ($elapsed < $this->intervalNs) {
            $sleepNs = $this->intervalNs - $elapsed;
            $sec = (int)($sleepNs / 1_000_000_000);
            $ns = $sleepNs % 1_000_000_000;
            time_nanosleep($sec, $ns);
        }
        $lastTime = hrtime(true);
    }
}

// 限制每秒最多 50 次
$limiter = new RateLimiter(50);
for ($i = 0; $i < 100; $i++) {
    $limiter->wait();
    // 執行任務
    echo "Task $i at " . date('H:i:s.u') . "\n";
}
?>

注意事項

  1. 精度受限於系統調度器:納秒延遲僅為請求值,實際喚醒時間取決於內核調度精度 (通常 1ms 級)。
  2. 不要用於長時間睡眠:長延遲請用 sleep(),避免納秒參數溢出。
  3. Windows 替代方案:usleep($microseconds) 或 com_dotnet 調用 Sleep() API。
  4. 信號處理:長時間睡眠易被信號中斷,生產代碼應檢查返回值並決定是否重試。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved