Time_nanos Sleep()は、NANOCONDレベルの遅延を実装するためのPHPの関数です。 Sleep()またはUSLoop()よりも正確な一時停止実行方法を提供します。この関数は、異なる動作環境(CLIやWebなど)で異なって機能する可能性があり、開発者はそれを使用する際にいくつかの重要な詳細に注意を払う必要があります。
<?php
// 一時停止 2 2番 100 万纳2番(今すぐ 0.001 2番)
time_nanosleep(2, 1000000);
?>
この関数は2つのパラメーターを受信します。1つ目は秒数( int $ seconds )、2つ目はナノ秒数( int $ nanoconds 、0〜999999999)です。実行中、エラーや割り込みがない場合、指定された時間を正確に一時停止します。
CLI環境:コマンドラインでPHPスクリプトを実行すると、 Time_nanos Sleep()は、予想される一時停止時間に最も近いものを実行します。これは、CLI環境には比較的十分なリソースがあり、干渉が少なく、オペレーティングシステムのスケジューリングがレイテンシへの影響が少ないためです。
Web環境(Apacheやnginxを駆け抜けるなど): Time_nanosLoop()は、最大実行時間( MAX_EXECUTION_TIME )、リソーススケジューリング、同時処理など、Webサーバーの制限により正確な遅延を達成できない場合があります。
PHPは通常、Web環境でMAX_EXECUTION_TIME制限の対象となります。たとえば、:
ini_set('max_execution_time', 3); // スクリプトはせいぜい実行できます32番
time_nanosleep(2, 800000000); // 実際にアプローチを待っています2.82番
最大実行時間を超えた場合、スクリプトは実行を中止し、エラーをスローします。 CLI環境では、この制限は通常存在せず、スクリプトはより長く実行できます。
Web環境でtime_nanosleep()を使用することは、通常、ページの読み込みを遅らせるために直接使用されるため、通常は良い考えではありません。例えば:
<?php
// で推奨されていません Web ページで直接使用します
time_nanosleep(3, 0);
echo "ページ遅延ロード";
?>
この練習により、ページの応答が遅く、ユーザーエクスペリエンスが低下します。正しいアプローチは、PHPスクリプトをブロックするのではなく、非同期タスク、キュー処理、またはフロントエンドのロードアニメーションに遅延操作を配置することです。
CLI環境でクローラーとバッチタスクを書くときに速度を制限するために使用されます。
foreach ($urls as $url) {
file_get_contents("https://gitbox.net/api/fetch?url=" . urlencode($url));
time_nanosleep(0, 500000000); // 一時停止0.52番
}
ファイルの変更を聞くなど、タイムリーなポーリングスクリプト:
while (true) {
clearstatcache();
$lastModified = filemtime("/path/to/file.txt");
// ロジックの処理...
time_nanosleep(1, 0); // 每2番检测一次
}
ナノ秒の精度は必須ではありません。一部のオペレーティングシステムまたはPHPバージョンでは、特に着信のナノ秒値が小さすぎる場合、 time_nanosleep()の精度は不十分な場合があります。
中断情報は中断されたときに返されます:中断した場合、未完成の睡眠時間を含む配列を返します。
エラー処理提案:
if (time_nanosleep(1, 500000000) === false) {
echo "遅延障害。\n";
}
Time_nanos Sleep()は、強力ですが、誤用されやすい機能です。 CLI環境では、開発者がタスクの実行の頻度を正確に制御したり、軽量待機を禁止していないことを実装するのに役立ちます。 Web環境では、ページの応答速度とユーザーエクスペリエンスに影響を与えないように、この関数を使用する際には非常に注意する必要があります。この機能を合理的に使用し、環境特性とリソースの制限に協力することによってのみ、その価値を本当に及ぼすことができます。