PHPでポーリングメカニズムを実装する場合、一般的に使用される遅延関数はSleep()またはUSLoop()です。ただし、これら2つは、特に高頻度と低潜伏期のポーリングシナリオで、精度と安定性に一定の制限があります。この記事では、PHPビルトイン機能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()は、中断されると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ポーリングシステムの安定性と精度を大幅に改善することができ、アプリケーションの応答性と信頼性を高めることができます。