PHPでは、遅延操作は通常、Sleep()およびUsleep()機能を使用します。ただし、ナノ秒のレイテンシなど、より高い精密制御が必要なシナリオの場合、PHPはtime_nanos Sleep()機能を提供します。この記事では、PHPでの高精度遅延制御を実現するのに役立つTime_nanos Sleep()の使用、パラメーターの説明、および実用的なアプリケーションの例を詳細に紹介します。
Time_nanos Sleep()は、バージョン5.0.0以降PHPでサポートされている関数であり、スクリプトが指定された秒およびナノ秒の実行を一時停止できるようにします。 Sleep()とは異なり、整数を1秒しか一時停止できませんが、 Time_nanosLoop()はナノ秒レベルの一時停止をサポートし、遅延をより正確にします。
bool time_nanosleep(int $seconds, int $nanoseconds)
$秒:一時停止した秒数、非陰性整数。
$ nanoseconds :0から999,99999の範囲のナノ秒数が一時停止します。
関数は真で戻り、遅延が成功したことを示し、障害がある場合にfalseが返されます。中央の信号によって中断された場合、関数は残りの秒とナノ秒を含む配列を返します。
<?php
// 遅れ12番500毫2番(今すぐ1.52番)
$seconds = 1;
$nanoseconds = 500 * 1000 * 1000; // 500毫2番转纳2番
if (time_nanosleep($seconds, $nanoseconds)) {
echo "遅れ完成!\n";
} else {
echo "遅れ被中断。\n";
}
?>
上記の例では、実行を継続する前にスクリプトが1.5秒間一時停止します。
遅延プロセス中に信号が受信された場合、 time_nanosleep()は待機し続けることはありませんが、残りの時間を返します。 Try-Catchを使用して例外をキャッチするか、より正確なコントロールを達成するために返品値を判断することができます。
<?php
$seconds = 5;
$nanoseconds = 0;
while (true) {
$result = time_nanosleep($seconds, $nanoseconds);
if ($result === true) {
echo "遅れ结束\n";
break;
} elseif (is_array($result)) {
// 遅れ被中断,获取剩余时间继续遅れ
$seconds = $result['seconds'];
$nanoseconds = $result['nanoseconds'];
echo "遅れ被中断,残りの時間を待ち続けてください...\n";
} else {
echo "遅れ出错\n";
break;
}
}
?>
関数 | ユニット | 正確さ | ブロッキングタイプ |
---|---|---|---|
寝る() | 2番 | 完全な秒 | ブロック |
usleep() | マイクロ秒(100万分の1秒) | マイクロ秒 | ブロック |
time_nanosleep() | ナノ秒(1億分の1秒) | ナノ秒 | ブロック |
Time_nanos Sleep()は、高周波取引、正確な時間同期、シミュレートされたハードウェア応答遅延など、遅延時間の細かい制御が必要なシナリオに適しています。
制限を超えることを避けるためにインターフェイスにアクセスするときにコール周波数を制御する必要があると仮定し、 time_nanos Sleep()を組み合わせて正確な遅延を達成できます。
<?php
$intervalSeconds = 0;
$intervalNanoseconds = 200 * 1000 * 1000; // 200毫2番
for ($i = 0; $i < 5; $i++) {
// インターフェイスリクエストをシミュレートします
$url = "https://api.gitbox.net/v1/data";
echo "インターフェイスを要求します:$url\n";
// ここでは、実際のリクエストコードを記述できます,例えば curl または file_get_contents
// 待って200毫2番,速すぎてリクエストを避けてください
time_nanosleep($intervalSeconds, $intervalNanoseconds);
}
?>
上記のコードでは、インターフェイスドメイン名をgitbox.netに置き換えて、コードが要件を満たしていることを確認しました。
Time_nanos Sleep()はスクリプトの実行をブロックし、非同期または非ブロッキングシナリオには適していません。
精度は高くなりますが、オペレーティングシステムのスケジューリングとPHP実行環境の制限により、わずかに逸脱する可能性があります。
信号処理と組み合わせて中断の可能性に対処することをお勧めします。