現在の位置: ホーム> 最新記事一覧> Time_nanos Sleepを使用して、より安定したポーリングシステムを実現します

Time_nanos Sleepを使用して、より安定したポーリングシステムを実現します

gitbox 2025-05-26

PHPでポーリングメカニズムを実装する場合、一般的に使用される遅延関数はSleep()またはUSLoop()です。ただし、これら2つは、特に高頻度と低潜伏期のポーリングシナリオで、精度と安定性に一定の制限があります。この記事では、PHPビルトイン機能Time_nanos Sleep()を使用して、より安定した正確なポーリングシステムを実現する方法を紹介し、それによりプログラムのパフォーマンスと応答の精度が向上します。

Time_nanos Sleepを選択する理由

Time_nanos Sleep()は、php 5.0.0の後に追加された新しい機能です。開発者は、Sleep() (秒)およびUSLEEP() (マイクロ秒)よりもはるかに高い精度で、ナノ秒で遅延できるようになります。その署名は次のとおりです。

 bool time_nanosleep(int $seconds, int $nanoseconds)
  • $秒は秒数を表し、非陰性整数でなければなりません

  • $ nanosecondsは、0〜999,999,999の範囲のナノ秒数を表します

Uselep()と比較して、 Time_nanosLeep()はより高い時間精度をサポートし、異なるオペレーティングシステムでもより安定して実行します。

ポーリングの例

以下は、 Time_nanos Sleep()を使用して、ポーリング間隔ごとに100ミリ秒(つまり0.1秒)の安定した遅延を達成する簡単なポーリングスクリプトを示しています。

 <?php

while (true) {
    // ポーリングリクエストをシミュレートします
    $response = file_get_contents("https://gitbox.net/api/check_status");

    // 応答データの処理
    echo "ポーリング結果:" . $response . PHP_EOL;

    // 安定して待っています100ミリ2番(02番 + 100,000,000纳2番)
    time_nanosleep(0, 100000000);
}

?>

この例では、ポーリング間隔は100ミリ秒、つまり毎秒最大10回の投票です。 Time_nanos Sleep()を使用すると、遅延時間がより正確になり、従来のUSELLEEP()が高負荷で発生する可能性のある時間のドリフトを回避します。

Time_nanos Sleepのエラー処理

Time_nanos Sleep()は、中断されるとfalseを返すことに注意してください。残りの遅延は、 time_nanosleep()の戻り値を介して取得できることに注意してください。ポーリングの安定性を確保するために、次の改善を行うことができます。

 <?php

function stableSleep(int $seconds, int $nanoseconds) {
    while (true) {
        $result = time_nanosleep($seconds, $nanoseconds);
        if ($result === true) {
            break;
        }
        // 残りの時間は眠り続けます
        $seconds = $result['seconds'];
        $nanoseconds = $result['nanoseconds'];
    }
}

while (true) {
    $response = file_get_contents("https://gitbox.net/api/check_status");
    echo "ポーリング結果:" . $response . PHP_EOL;

    stableSleep(0, 100000000); // 100ms
}

?>

これにより、システム信号によって遅延が中断されると、プログラムは残りの待機時間を完了し続けることができます。

非同期またはマルチスレッドを組み合わせて効率を向上させます

Time_nanos Sleep()は正確な遅延を保証しますが、投票プロセスにブロッキングネットワークリクエストが含まれている場合、全体的なポーリング応答時間は依然として制限されます。非同期リクエストやマルチスレッド(たとえば、 curl_multi_*またはpthreads拡張機能を使用)と組み合わせてポーリング効率を最適化することをお勧めします。

要約します

  • Time_nanos Sleep()は、高精度のポーリング要件に適したナノ秒レベルの精度遅延を提供します

  • ポーリングの安定性を確保するために、プロセスシステム信号割り込みへの返品値と組み合わせる

  • ネットワーク要求の遅延が長い場合、非同期またはマルチスレッドメカニズムと組み合わせて使用​​することをお勧めします

Time_nanos Sleep()を合理的に使用することにより、PHPポーリングシステムの安定性と精度を大幅に改善することができ、アプリケーションの応答性と信頼性を高めることができます。