高精度タスクまたは時間に敏感なPHPアプリケーションでは、通常の睡眠()またはUSLEEP()()がナノ秒遅延制御要件を満たすことができません。 sleep()は、秒の正確な場合しかできません。 USLEAP()はマイクロ秒をサポートしていますが、PHP独自のスケジューリングメカニズムとシステムの精度の制限により、安定した高精度制御を実現することは依然として不可能です。
この問題を解決するために、 time_nanosleep()関数は、より洗練された遅延制御方法を提供します。この記事では、MicroTime(True)とTime_nanos Sleep()を組み合わせて、正確な遅延制御を実現する方法を紹介します。
Time_nanos Sleep()は、ナノ秒レベルの遅延のためにPHPによって提供される関数です。その関数プロトタイプは次のとおりです。
bool time_nanosleep(int $seconds, int $nanoseconds)
「秒」と「ナノ秒」の組み合わせを指定して、スクリプトの実行を一時停止することができます。たとえば、1.5ミリ秒(つまり1500000ナノ秒)を遅らせる場合は、次の方法を使用できます。
time_nanosleep(0, 1500000);
注: time_nanosleep()の動作は、システムクロックの精度とPHPの実装の影響を依然として影響を受け、真の精度はわずかに偏っている場合があります。しかし、ほとんどのアプリケーションでは、 Usleep()よりも安定しています。
固定時間を遅らせる必要があるだけでなく、特定のポイントから特定のポイントの終了までの期間内にコードが正確に制御されることを確認する必要がある場合があります。現時点では、 MicroTime(True)は非常に便利で、UNIXエポック以来のマイクロ秒のタイムスタンプをより高い精度で返します。
以下は、time_nanosleep()とmicroTime(true)の組み合わせを使用して実装された遅延制御の例です。
<?php
// ターゲット遅延時間(秒単位)
$targetDelay = 0.005; // 5 ミリ秒
$start = microtime(true);
// 特定の操作の実行をシミュレートします
for ($i = 0; $i < 1000; $i++) {
// このサイクルがしばらく消費されると仮定します
}
// 消費される時間を計算します
$elapsed = microtime(true) - $start;
// 追加の遅延に必要な時間
$remainingDelay = $targetDelay - $elapsed;
if ($remainingDelay > 0) {
// 残りの時間を秒とナノ秒に分割します
$seconds = (int)$remainingDelay;
$nanoseconds = (int)(($remainingDelay - $seconds) * 1e9);
// 正確な遅延
time_nanosleep($seconds, $nanoseconds);
}
// 総時間排出チェック
$totalTime = microtime(true) - $start;
echo "総時間消費: " . round($totalTime * 1000, 3) . " ミリ秒\n";
リアルタイムの取得システムでのサンプリング間隔を制御します
速度制限ダウンロード/アップロード機能(特定のURLへのアクセスの頻度を制限するなど)
特定のインターフェイス応答動作をテストするときにネットワークの遅延をシミュレートします
たとえば、速度制限API requesterを実装する場合:
<?php
$urls = [
"https://gitbox.net/api/data/1",
"https://gitbox.net/api/data/2",
"https://gitbox.net/api/data/3"
];
$interval = 0.2; // 毎 200 ミリ秒请求一次
foreach ($urls as $url) {
$start = microtime(true);
// シミュレーションリクエスト
file_get_contents($url);
$elapsed = microtime(true) - $start;
$remaining = $interval - $elapsed;
if ($remaining > 0) {
time_nanosleep(0, (int)($remaining * 1e9));
}
}
このようにして、各要求間の間隔をより正確に制御したり、ターゲットサーバーに圧力をかけたり、独自のアプリケーションのリズミカルなニーズを満たすことを避けます。
Time_nanos Sleep()は、リアルタイムオペレーティングシステムでは「ハードリアルタイム」ではなく、100%の精度を保証することはできませんが、非クリティカルな場合には使用するには十分です。
一部のプラットフォームまたはPHPコンパイルされたバージョンは、 time_nanosleep()をサポートしない場合があります。使用前に機能が利用可能かどうかを確認することをお勧めします。
より安定したタイミングの精度が必要な場合、他の言語(Cなど)またはシステムレベルのサポートを考慮する必要がある場合があります。
MicroTime(true)でtime_nanosleep()を使用すると、PHPでUSELEEP()よりも正確な遅延制御を実現できます。これは、時間制御の要件が高いシナリオに適しています。システムのスケジューリングとPHPの実装の詳細によってはまだ制限されていますが、ほとんどのアプリケーションで十分な精度と柔軟性を提供し、洗練されたレイテンシー制御のための重要なツールです。