現在の位置: ホーム> 最新記事一覧> Time_nanos Sleepを使用するためのベストプラクティスとセキュリティの提案

Time_nanos Sleepを使用するためのベストプラクティスとセキュリティの提案

gitbox 2025-05-20

Sleep()およびUsleep()は、PHPで遅延操作を実行するときに最も一般的に言及されている機能です。ただし、より正確な遅延制御が必要な場合、特にナノ秒精度が必要な場合、 Time_nanos Sleep()は不可欠なツールになります。この記事では、 Time_nanos Sleep() 、一般的なベストプラクティスの使用方法、および実際の開発における関連するセキュリティとパフォーマンストラップを回避する方法を詳細に分析します。

1。関数の紹介

Time_nanos Sleep()は、PHPが提供する関数であり、指定された時間の間、秒の精度とナノ秒でプログラムの実行を一時停止できます。関数プロトタイプは次のとおりです。

 bool time_nanosleep(int $seconds, int $nanoseconds)

パラメーター説明:

  • $秒:整数秒。

  • $ nanoseconds :整数ナノ秒(0〜999,999,999)。

返品値:

  • 真実を返すことは成功を意味します。

  • falseを返すか、例外をスローすることは、エラーまたは割り込みを示します。

待機期間中にシステム信号によって関数が中断された場合、未完成の時間を含む配列が返されることに注意してください。

 [
    "seconds" => int,
    "nanoseconds" => int
]

2。基本的な使用法

それを使用する最も簡単な方法は次のとおりです。

 <?php
echo "スタートを待ちます...\n";
time_nanosleep(1, 500000000); // 一時停止 1.5 2番
echo "終わりを待ちます。\n";

上記のコードは、プログラムを1.5秒間一時停止し、その後のロジックを実行し続けます。

3。信号の中断の処理

生産環境では、 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";

この書き込み方法により、途中で中断されたとしても、遅延が完全に実行されることが保証されます。

4.一般的なエラーと予防策

1。パラメーター範囲

ナノ秒パラメーターの最大値は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);

2。高精度タイマーで使用します

時間の正確な制御が必要な場合は、 hrtime()と組み合わせて使用​​できます。

 $start = hrtime(true); // 纳2番计时器
time_nanosleep(0, 500000000); // 待って 0.5 2番
$end = hrtime(true);
$elapsed = ($end - $start) / 1e9;
echo "実際の時間がかかります: {$elapsed} 2番\n";

5。他の遅延関数との比較

関数正確さ中断することは可能ですか?プラットフォームサポート
寝る() 2番はいクロスプラットフォーム
usleep()マイクロ秒いいえWindows <= PHP 5.3はサポートしていません
time_nanosleep()ナノ秒はいクロスプラットフォーム

6.実際のアプリケーションシナリオ

1。速度制限処理(APIコールスロットリングなど)

 foreach ($requests as $request) {
    call_api("https://gitbox.net/api/send", $request);
    time_nanosleep(0, 250000000); // 毎 250ms リクエスト
}

2。微調整制御

マルチスレッドまたはマルチプロセス操作を使用する場合、リソースの競争を回避するために、わずかな遅延を追加できます。

 for ($i = 0; $i < 5; $i++) {
    fork_process($i);
    time_nanosleep(0, 100000000); // 100ms 遅れ,競合を避けてください
}

3。待機するアニメーションまたはポーリング

たとえば、CLIアニメーションを作成するとき:

 $frames = ['-', '\\', '|', '/'];
while (true) {
    foreach ($frames as $frame) {
        echo "\r読み込み $frame";
        time_nanosleep(0, 100000000); // 0.1 2番
    }
}

7。安全アドバイス

time_nanosleep()は便利ですが、次のようなリソースブロッキング攻撃にも使用できます。

 // 恶意遅れ造成的服务阻断
time_nanosleep(10, 0);

提案:

  • ユーザーが遅延パラメーターを制御できるようにしないでください。

  • 最大制限とログ遅延ログを使用します。

  • コアプロセスを保護するために、タイムアウトおよびウォッチドッグメカニズムに協力します。

結論

Time_nanos Sleep()は、高精度のレイテンシコントロールを提供する強力なツールであり、一部の粒度タスクではSleep()よりも適しています。合理的に使用すると、プログラムをより柔軟で効率的に、遅延処理、同時制御、およびスロットリングを効率的にすることができます。ただし、過剰または不適切な使用は、パフォーマンスの無駄や安全性の問題を引き起こす可能性もあります。したがって、その原則を習得することに基づいて慎重かつ戦略的に使用することは、すべてのPHP開発者が持つべき能力です。