高精度の時間制御PHPアプリケーションでは、 Time_nanosLoop()は、開発者がプログラムを一定期間秒単位とNAN秒で「スリープ」することを可能にする一般的なツール関数です。ただし、実際に使用して、理論的にはナノ秒遅延をサポートしていますが、その精度は、オペレーティングシステムのスケジューリングメカニズム、PHP自体の実装、およびハードウェアクロック精度によってしばしば制限されます。これは、100マイクロ秒遅延を設定したとしても、システムがミリ秒であってもさらに遅れる可能性があることを意味します。
高周波取引シミュレーター、データ収集同期メカニズム、またはリアルタイム制御ロジックなど、非常に時間依存のアプリケーションを構築している場合、 Time_nanosLoop()の「信頼できない」()は特に致命的です。それでは、 Time_nanosLoop()が十分に正確ではない場合はどうすればよいですか?この記事では、より信頼できるいくつかの代替品を紹介します。
USLEEP()は絶対的な精度を保証することはできませんが、一部のシステムでは、その安定性はTime_nanos Sleep()よりも優れています。
usleep(100); // 遅れ100マイクロ秒
注: USLoop()は、ナノ秒(1秒= 1000000マイクロ秒)の代わりにマイクロ秒を受け入れるため、ナノ秒遅延を直接実装することはできません。しかし、ほとんどのビジネスシナリオでは、マイクロ秒で十分です。
ナノ秒レベル制御が必要な場合は、CPUで忙しい待機で達成できます。この方法は、所定の間隔に到達するまで高精度時間を継続的に読み取ることですが、多くのCPUを消費し、生産環境には適していません。
function nano_sleep_busy($nanoseconds) {
$start = hrtime(true);
$end = $start + $nanoseconds;
while (hrtime(true) < $end);
}
nano_sleep_busy(50000); // 遅れ50マイクロ秒
HRTIME(true)は、時間間隔の正確な制御に適した現在のナノ秒タイムスタンプを返します。
極端な要件を持つシステムの場合、PHP独自の機能は不十分な場合があります。現時点では、C/C ++で記述されたCLIツールまたはシステムレベルのコマンドを呼び出して、高精度の遅延を完了することができます。
たとえば、コンパイルされた実行可能ファイルプログラムを呼び出します(既にSleep_NSツールがあると仮定します):
exec('/usr/local/bin/sleep_ns 50000'); // 遅れ50マイクロ秒
このツールを制御するサーバーに配置することもできます。たとえば、:
file_get_contents("https://gitbox.net/tools/sleep_ns?duration=50000");
このようにして、制御ロジックは、より適切な言語に渡すことができます。
PHP環境がSwooleをサポートしているか、ReactPhp/Event Loopメカニズムを使用している場合、非同期非ブロッキングメソッドを介して高精度遅延制御を実行できます。
Swoole\Timer::after(0.05, function () {
echo "50マイクロ秒后执行\n";
});
基礎となる層は依然としてシステムタイマーに依存していますが、SwooleはPHPの実行エンジンとバイパスで書かれているため、精度とパフォーマンスの両方がネイティブ機能よりも優れています。
方法 | 最小遅延粒度 | 正確さ | ブロックされているかどうか | 提案された使用 |
---|---|---|---|---|
Time_nanos Sleep | ナノ秒 | 低い | はい | 通常の遅延シナリオ |
USLEEP | マイクロ秒 | 中くらい | はい | 遅延<1秒 |
忙しい待機 + hrtime | ナノ秒 | 高い | はい(高いCPU) | 極端な精度要件 |
外部ツール | 実装に依存します | 高い | 制御可能 | システムと統合します |
Swoole/Reactphp | マイクロ秒 | 高い | いいえ | 高い並行性/コルーチンシナリオ |
ほとんどのシナリオでは、数十から数百マイクロ秒まで遅延を正確に制御したい場合、 Usleep()とHrtime()の組み合わせはすでに非常に実用的です。また、非常に遅延に敏感な高性能アプリケーションを構築している場合は、非同期フレームワーク(Swooleなど)を使用するか、より適切な基礎言語に切り替えて、関数の一部を実装することをお勧めします。
覚えておいてください:PHPは、リアルタイム制御のために設計された言語ではありません。技術的な境界を合理的に選択することによってのみ、信頼できる効率的なプログラムを書くことができます。