現在の位置: ホーム> 最新記事一覧> Time_nanos Sleepを使用して、正確な睡眠時間制御を実現します

Time_nanos Sleepを使用して、正確な睡眠時間制御を実現します

gitbox 2025-05-28

PHPでは、多くの場合、プログラムを一定期間一時停止する必要があります。これは、ポーリング、タイミングタスク、または制限操作の速度を扱うときに非常に一般的です。通常、人々はSleep()機能を使用してこれを達成しますが、 Sleep()の時間単位は秒であり、ミリ秒またはナノ秒の正確な制御要件を満たすことができません。この時点で、PHPはtime_nanosleep()機能を提供します。これにより、秒の精度とナノ秒で一時停止時間を制御できます。

time_nanosleep()とは何ですか?

Time_nanos Sleep()は、現在のプロセスが指定された秒数とNANOCONDSを一時停止するために、PHP 5.0.0以上で提供される関数です。 Sleep()と比較して、秒の正確な場合しかできません。Time_nanosLoop ()により、一時停止時間をより柔軟に制御できます。

関数定義は次のとおりです。

 bool time_nanosleep(int $seconds, int $nanoseconds)
  • $秒:一時停止した秒数、整数。

  • $ nanoseconds :整理されたナノ秒の数は、0から999,999,999の範囲です。

一時停止が成功した場合、関数はtrueを返し、中央の信号によって中断されると、残りの時間を含む配列が返されます。

使用の例

1秒と500ミリ秒(つまり、1.5秒)で一時停止する方法の簡単な例を次に示します。

 <?php
echo "開始時間:" . microtime(true) . PHP_EOL;

$seconds = 1;
$nanoseconds = 500000000; // 500 ミリ2番 = 500,000,000 ナノ2番

if (time_nanosleep($seconds, $nanoseconds)) {
    echo "睡眠終了時間:" . microtime(true) . PHP_EOL;
} else {
    echo "睡眠が中断されました" . PHP_EOL;
}
?>

実行の結果は、時差が約1.5秒で、タイムスタンプが2回表示されます。

割り込みを処理します

Time_nanos Sleep()がシステム信号によって中断されると、残りの秒とNan秒を含む配列が返されます。睡眠を続けるために、戻り値に従ってtime_nanosleep()を再度呼び出すことができます。例は次のとおりです。

 <?php
$seconds = 2;
$nanoseconds = 0;

while (true) {
    $result = time_nanosleep($seconds, $nanoseconds);
    if ($result === true) {
        echo "完全に眠る" . PHP_EOL;
        break;
    } elseif (is_array($result)) {
        echo "睡眠が中断されました,残り時間:{$result['seconds']}2番 {$result['nanoseconds']}ナノ2番" . PHP_EOL;
        $seconds = $result['seconds'];
        $nanoseconds = $result['nanoseconds'];
    } else {
        echo "眠れなかった" . PHP_EOL;
        break;
    }
}
?>

この記事は、プログラムが信号によって中断された後も所定の睡眠時間を完了し続けることができることを保証します。

HTTP要求と組み合わせた使用シナリオの例

各リクエストの間に200ミリ秒間一時停止するリクエスト速度制限関数を実装すると、 Curlと併せてリクエストを送信し、時間を正確に制御するためにtime_nanos Sleep()を使用できます。これがサンプルコードです:

 <?php
$urls = [
    "https://gitbox.net/api/data1",
    "https://gitbox.net/api/data2",
    "https://gitbox.net/api/data3",
];

foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $response = curl_exec($ch);
    if (curl_errno($ch)) {
        echo "リクエストが失敗しました:" . curl_error($ch) . PHP_EOL;
    } else {
        echo "リクエストが成功しました:" . substr($response, 0, 50) . "..." . PHP_EOL;
    }
    curl_close($ch);

    // 一時停止 200 ミリ2番
    time_nanosleep(0, 200000000);
}
?>

このコードは、3つのインターフェイスを順番にリクエストし、各リクエスト後に200ミリ秒間一時停止するため、頻繁なリクエストを回避します。

要約します

  • Time_nanos Sleep()を使用すると、PHPプログラムを数秒およびナノ秒精度で一時停止できます。

  • 従来の睡眠()USLEEP()よりも柔軟であり、時間制御の精度のための高い要件を持つシナリオに適しています。

  • プログラムロジックの堅牢性を確保するために、信号割り込みの取り扱いに注意してください。

  • time_nanosleep()は、速度制限、間隔制御、または微細なスケジューリングが必要な場合、非常に実用的な機能です。

Time_nanos Sleep()を合理的に使用することにより、PHPアプリケーションはより正確で効率的に時間制御を効率的にすることができます。