PHPにタイマー関数を実装する方法はたくさんあります。 Time_nanos Sleep関数は、スクリプトが指定された秒およびNan秒の実行を一時停止できるようにする非常に正確な睡眠関数であるため、高精度タイマーを実装するために使用できます。この記事では、 Time_nanos Sleep機能を使用してシンプルなタイマーを作成する方法について詳しく説明します。
Time_nanos Sleep関数は、現在実行されているスクリプトによって指定された時間を一時停止するために使用されます。時間の単位には、秒とナノ秒が含まれます。構文は次のとおりです。
bool time_nanosleep(int $seconds, int $nanoseconds)
$秒:一時停止した秒数、非陰性整数。
$ nanoseconds :0から999,99999の範囲のナノ秒数が一時停止します。
関数は真で戻り、通常の睡眠が完了したことを示し、失敗したときにfalseを返すか、エラーがトリガーされます。
Time_nanos Sleepは、次のような、待ち時間の正確な制御が必要なシナリオに非常に適しています。
高精度タイマーを実装します
実行頻度を制御します
CPUアイドルを避け、リソースの無駄を減らします
次の例では、合計時間に達するまで、指定されたすべてのミリ秒数をタイムスタンプに出力するタイマーを実装します。
<?php
/**
* シンプルなタイマー機能,指定された間隔でタスクを実行します
*
* @param int $interval_ms 間隔時間,ユニットミリ2番
* @param int $total_duration_ms 合計時間,ユニットミリ2番
*/
function simple_timer(int $interval_ms, int $total_duration_ms)
{
$start_time = microtime(true);
$elapsed = 0;
while ($elapsed < $total_duration_ms / 1000) {
// 寝る2番とナノ2番を計算します
$seconds = intdiv($interval_ms, 1000);
$nanoseconds = ($interval_ms % 1000) * 1000000;
// 寝る指定時間
time_nanosleep($seconds, $nanoseconds);
// 出力電流タイムスタンプと実行時間
$current_time = microtime(true);
$elapsed = $current_time - $start_time;
echo "Elapsed: " . round($elapsed, 3) . " seconds\n";
}
echo "タイムエンド!\n";
}
// 他のすべて 500 ミリ2番単位で1回実行します,続き 5 2番
simple_timer(500, 5000);
MicroTime(True)を使用して、高精度の現在の時間を取得します。
ループでtime_nanosleepを呼び出して、指定された時間のスクリプトを一時停止します。
実行時間を計算して印刷します。
セットの合計期間に達するまでサイクルします。
Time_nanos Sleepは、信号によって中断される場合があります。中断された場合、関数は虚偽を返し、警告をトリガーします。信号は、 PCNTL関数を使用してキャプチャでき、安定性を確保できます。
ナノ秒の精度はオペレーティングシステムに依存し、すべてのシステムが非常に細かいナノ秒レベルの睡眠をサポートするわけではありません。
一部の環境では、 UselepとTime_nanos Sleepの正確性と効果はあまり違いないかもしれません。
PHPを介してリモートインターフェイスにアクセスし、タイマーを組み合わせて定期的なリクエストを作成する必要がある場合は、次のコードの例を使用できます。
<?php
function fetch_data_periodically($url, $interval_ms, $times)
{
for ($i = 0; $i < $times; $i++) {
// リクエストを送信します
$response = file_get_contents($url);
echo "Response #$i: " . substr($response, 0, 50) . "...\n";
// 寝る
$seconds = intdiv($interval_ms, 1000);
$nanoseconds = ($interval_ms % 1000) * 1000000;
time_nanosleep($seconds, $nanoseconds);
}
}
$url = "https://gitbox.net/api/data";
fetch_data_periodically($url, 1000, 3);
このコードは、1秒ごとにgitbox.netのインターフェイスを要求し、3回連続で実行します。