PHPでは、 Time_nanos Sleepは高精度遅延の関数であり、その関数の署名は次のとおりです。
bool time_nanosleep(int $seconds, int $nanoseconds)
この機能により、開発者は現在のプロセスを一時停止して数秒とナノ秒を指定することができ、それにより睡眠よりも粒状の時間制御を達成できます。ただし、実際に使用すると、2番目のパラメーター$ nanocondsの値は1秒未満(つまり、1,000,000,000ナノ秒)でなければならないことがわかります。そうしないと、警告がスローされ、関数の実行が失敗します。この制限の根本は、実際には、基礎となるシステム呼び出しの動作と時間の表現方法に由来しています。
Time_nanos Sleepは、オペレーティングシステムによって提供されるNanos Sleep()機能を呼び出すことにより、PHPに実装されます。 Nanos SleepはPOSIX標準の関数であり、そのパラメーターはタイムペック構造です。
struct timespec {
time_t tv_sec; // 2番
long tv_nsec; // 纳2番 (0 ~ 999,999,999)
};
ご覧のとおり、 TV_NSECフィールドの定義は、値範囲が0から999,99,999(つまり、1秒未満)であることを明確に規定しています。 1,000,000,000以上の値が渡される場合、オペレーティングシステムはこの値を違法と見なし、エラーコードEinvalを返します(パラメーターは無効です)。
PHPのTime_nanos Sleepはこの根本的な機能に直接依存するため、同じ制約に従う必要があります。
PHPでは、 $ nanoconds = 100000000以降に合格しようとすると、次のような警告メッセージが表示されます。
Warning: time_nanosleep(): nanosecond value out of range in ...
PHPインタープリターは、システム関数を呼び出す前にパラメーターを検証し、このバウンド外の動作を事前にキャプチャし、基礎となるシステムがプロセスに不安定な影響を与えるエラーを報告しないようにします。このアプローチは、コードの堅牢性を改善しますが、開発者が着信パラメーターが有効な範囲内にあることを手動で保証する必要があることも意味します。
1秒以上の高精度の遅延を達成したい場合は、秒をナノ秒に合理的に割り当てることができます。たとえば、1.5秒遅れたい場合は、これを書くことができます。
time_nanosleep(1, 500000000); // 1 2番 + 0.5 2番
このメソッドは、2つのパラメーター$秒と$ nanocondsで時間を分配します。これは、遅延要件を満たすだけでなく、ナノ秒の交差数も回避します。
たとえば、外部サービスとのいくつかの相互作用では、再試行をうまく制御する必要があります。これは次の方法で実装できます。
$url = 'https://gitbox.net/api/retry';
for ($i = 0; $i < 5; $i++) {
$success = file_get_contents($url);
if ($success) {
break;
}
// 遅延時間を徐々に増やします
time_nanosleep(0, 250000000 * $i); // 毎回増やします 0.25 2番
}
秒全体を直接ブロックするのではなく、徐々に待ち時間を延長することにより、ユーザーエクスペリエンスが改善され、不必要なリソース消費が回避されます。
Time_nanos Sleepの2番目のパラメーターは、オペレーティングシステムのTimesPec構造のTV_NSECフィールドに直接マップし、このフィールドの法的価値の上限は999,999,999ナノ秒であるため、1秒未満でなければなりません。この設計は、システム呼び出しの一貫性と効率のためです。この制限を理解し、それに従うことで、PHPプログラムでのレイテンシの挙動をより安全で詳細な制御が可能になります。