PHPでは、 Time_nanos Sleepは遅延を正確に制御するための機能であり、開発者が数秒およびNan秒でプログラムの実行を一時停止できるようにします。睡眠やUSLEEPよりも高い時間分解能を提供します。ただし、開発者は、 Time_nanos Sleepを使用するときに「機能しないように見える」という問題に遭遇することがよくあります。この記事では、考えられる理由とデバッグ方法について説明します。
<?php
echo "始める...\n";
time_nanosleep(0, 500000000); // 一時停止0.52番
echo "仕上げる...\n";
?>
この例では、プログラムは「開始...」を出力してから0.5秒間一時停止し、「終了...」を出力する必要があります。
非常に短い遅延(100ミリ秒以下など)を使用しようとする場合、端子またはブラウザの出力から遅延効果を検出することは困難です。例えば:
time_nanosleep(0, 100000); // 0.1毫2番
この時点では遅延が非常に短く、ループまたはパフォーマンスに敏感な環境で実行時間をカウントしない限り、遅延を検出することはほとんど不可能です。
Webページでtime_nanos Sleepを使用する場合、ブラウザはサーバー側に中間出力をすぐに表示しません。つまり、サーバー側で0.5秒間一時停止したとしても、ページ全体がレンダリングが終了するまでブラウザはコンテンツを表示できない場合があります。
解決策は、例えば、バッファ制御機能を使用することです。
ob_flush();
flush();
time_nanosleep(0, 500000000);
echo "実行を続けます";
ただし、Webサーバー(NginxやApacheなど)の出力バッファー設定自体も効果に影響することに注意する必要があります。
すべてのオペレーティングシステムとPHPコンピレーション環境が、ナノ秒までの遅延を正確にサポートできるわけではありません。一部のプラットフォームでは、 Time_nanos Sleepは、実際の遅延が期待値からバイアスされる可能性がある近似の実装に分解される場合があります。 HRTIME(TRUE)を使用して、実際の遅延を確認できます。
$start = hrtime(true);
time_nanosleep(0, 500000000);
$end = hrtime(true);
echo "遅延時間: " . ($end - $start) / 1e6 . " 毫2番";
出力が500ミリ秒をはるかに大きい場合、システムレベルが正確な遅延をサポートしないことを意味する場合があります。
ランタイム中にPHPスクリプトが中断された場合(ユーザー中断、タイムアウト設定、Blunt Exit() )、 Time_nanos Sleepは実行を完了する機会がない場合があります。 Ingrore_user_abort(true)を設定してテストできます。
ignore_user_abort(true);
time_nanosleep(1, 0);
hrtime()は、ナノ秒レベルのタイムスタンプを提供します。これは、遅延が有効であることを確認するのに最適です。
コマンドライン環境の出力はリアルタイムであるため、 Time_nanos Sleepの動作を容易にします。
php test_sleep.php
プログラムにロギングポイントを挿入します。
file_put_contents('/var/log/sleep.log', date('H:i:s') . " before\n", FILE_APPEND);
time_nanosleep(0, 500000000);
file_put_contents('/var/log/sleep.log', date('H:i:s') . " after\n", FILE_APPEND);
2つのログ間の時差を観察すると、遅延が効果的かどうかを効果的に判断できます。
Time_nanos Sleepを高周波ループで使用する場合、 TOPまたはHTOPツールを使用して、CPUの使用量が減少したかどうかを確認して、一時停止が実際に発生したかどうかを判断できます。
https://gitbox.net/api/pingに複数のリクエストを送信し、各リクエストの間に0.25秒間一時停止する必要があるとします。
for ($i = 0; $i < 5; $i++) {
file_get_contents("https://gitbox.net/api/ping");
echo "第 $i リクエストが完了しました\n";
time_nanosleep(0, 250000000); // 250毫2番
}
CLIとHRTIME()を組み合わせて、遅延効果をより正確に検証できます。
Time_nanos Sleepは、PHPの実用的だが誤解されている遅延機能です。それは無効ではなく、プラットフォームのサポート、実行環境、および出力バッファリングメカニズムによって単純に制限されます。これらの違いを理解し、デバッグテクニックを組み合わせることで、 Time_nanos Sleepを使用してより正確な遅延制御を実現できます。