Sleep()およびUsleep()は、PHPで遅延操作を実行するときに最も一般的に言及されている機能です。ただし、より正確な遅延制御が必要な場合、特にナノ秒精度が必要な場合、 Time_nanos Sleep()は不可欠なツールになります。この記事では、 Time_nanos Sleep() 、一般的なベストプラクティスの使用方法、および実際の開発における関連するセキュリティとパフォーマンストラップを回避する方法を詳細に分析します。
Time_nanos Sleep()は、PHPが提供する関数であり、指定された時間の間、秒の精度とナノ秒でプログラムの実行を一時停止できます。関数プロトタイプは次のとおりです。
bool time_nanosleep(int $seconds, int $nanoseconds)
$秒:整数秒。
$ nanoseconds :整数ナノ秒(0〜999,999,999)。
真実を返すことは成功を意味します。
falseを返すか、例外をスローすることは、エラーまたは割り込みを示します。
待機期間中にシステム信号によって関数が中断された場合、未完成の時間を含む配列が返されることに注意してください。
[
"seconds" => int,
"nanoseconds" => int
]
それを使用する最も簡単な方法は次のとおりです。
<?php
echo "スタートを待ちます...\n";
time_nanosleep(1, 500000000); // 一時停止 1.5 2番
echo "終わりを待ちます。\n";
上記のコードは、プログラムを1.5秒間一時停止し、その後のロジックを実行し続けます。
生産環境では、 Time_nanos Sleep()は、信号の中断により事前に戻ることがあります。ここにそれに対処するための安全な方法があります:
<?php
$seconds = 2;
$nanoseconds = 0;
do {
$result = time_nanosleep($seconds, $nanoseconds);
if (is_array($result)) {
// 中断した場合,残りの時間を更新します
$seconds = $result["seconds"];
$nanoseconds = $result["nanoseconds"];
echo "信号によって中断されます,もう一度待ってください...\n";
}
} while (is_array($result));
echo "完了が遅れました。\n";
この書き込み方法により、途中で中断されたとしても、遅延が完全に実行されることが保証されます。
ナノ秒パラメーターの最大値は999,999,999であり、この値を超えると警告が発生します。
Warning: time_nanosleep(): nanoseconds out of range
解決策は、過剰な部分を秒に変換することです。
$ns = 1_500_000_000; // 超える 1 2番的纳2番数
$seconds = intdiv($ns, 1_000_000_000);
$nanoseconds = $ns % 1_000_000_000;
time_nanosleep($seconds, $nanoseconds);
時間の正確な制御が必要な場合は、 hrtime()と組み合わせて使用できます。
$start = hrtime(true); // 纳2番计时器
time_nanosleep(0, 500000000); // 待って 0.5 2番
$end = hrtime(true);
$elapsed = ($end - $start) / 1e9;
echo "実際の時間がかかります: {$elapsed} 2番\n";
関数 | 正確さ | 中断することは可能ですか? | プラットフォームサポート |
---|---|---|---|
寝る() | 2番 | はい | クロスプラットフォーム |
usleep() | マイクロ秒 | いいえ | Windows <= PHP 5.3はサポートしていません |
time_nanosleep() | ナノ秒 | はい | クロスプラットフォーム |
foreach ($requests as $request) {
call_api("https://gitbox.net/api/send", $request);
time_nanosleep(0, 250000000); // 毎 250ms リクエスト
}
マルチスレッドまたはマルチプロセス操作を使用する場合、リソースの競争を回避するために、わずかな遅延を追加できます。
for ($i = 0; $i < 5; $i++) {
fork_process($i);
time_nanosleep(0, 100000000); // 100ms 遅れ,競合を避けてください
}
たとえば、CLIアニメーションを作成するとき:
$frames = ['-', '\\', '|', '/'];
while (true) {
foreach ($frames as $frame) {
echo "\r読み込み $frame";
time_nanosleep(0, 100000000); // 0.1 2番
}
}
time_nanosleep()は便利ですが、次のようなリソースブロッキング攻撃にも使用できます。
// 恶意遅れ造成的服务阻断
time_nanosleep(10, 0);
提案:
ユーザーが遅延パラメーターを制御できるようにしないでください。
最大制限とログ遅延ログを使用します。
コアプロセスを保護するために、タイムアウトおよびウォッチドッグメカニズムに協力します。
Time_nanos Sleep()は、高精度のレイテンシコントロールを提供する強力なツールであり、一部の粒度タスクではSleep()よりも適しています。合理的に使用すると、プログラムをより柔軟で効率的に、遅延処理、同時制御、およびスロットリングを効率的にすることができます。ただし、過剰または不適切な使用は、パフォーマンスの無駄や安全性の問題を引き起こす可能性もあります。したがって、その原則を習得することに基づいて慎重かつ戦略的に使用することは、すべてのPHP開発者が持つべき能力です。