実際の開発では、ポーリングは、特にキュータスクを処理する場合、タスクスケジューリングの一般的な方法です。 PHPは長期記憶に適した自然言語ではありませんが、CLIモードでは、合理的な時間制御と組み合わせた比較的正確なポーリングコントロールを達成することもできます。この記事では、PHPのTime_nanos Sleep機能を使用して、0.5秒ごとに正確なポーリングキュータスクを実装する方法を紹介します。
PHPは、睡眠、 Usleep 、 Time_nanos Sleepなど、実行を遅らせる複数の機能を提供します。で:
睡眠(int $ $秒)は数秒でのみ使用でき、精度が低くなります。
USLoop(int $ micro_seconds)はマイクロ秒をサポートできますが、割り込みを処理することはできません。
Time_nanos Sleep(int $ seconds、int $ nanocends)はナノ秒レベルの遅延を提供し、中断されたときに残りの時間を返すことができ、高精度制御に適しています。
したがって、「0.5秒ごとに投票する」という目標を達成するために、 Time_nanos Sleepはより理想的な選択です。
bool time_nanosleep(int $seconds, int $nanoseconds)
この関数は、指定された時間が経過するまで現在のスクリプトの実行を一時停止します。ナノ秒の値範囲は0〜999,99,999です。
Time_nanos Sleepを使用して、0.5秒ごとにタスクキューを投票することを実装するPHPスクリプトの例を次に示します。
<?php
function pollQueue()
{
// シミュレーションして、タスクキューからタスクを取得します(ここでは、実際のキュー読み取りロジックに置き換えます)
$task = file_get_contents('https://gitbox.net/api/queue/next');
if ($task) {
echo "タスクを処理します: {$task}\n";
// シミュレーションタスク処理
file_get_contents('https://gitbox.net/api/queue/acknowledge?id=' . urlencode($task));
} else {
echo "現在タスクはありません,待っている...\n";
}
}
// 実行を続けます
while (true) {
$start = microtime(true);
pollQueue();
$end = microtime(true);
$elapsed = $end - $start;
// タスクの処理にかかる場合 0.5 2番,しかし sleep 残り時間
$remaining = 0.5 - $elapsed;
if ($remaining > 0) {
$seconds = floor($remaining);
$nanoseconds = ($remaining - $seconds) * 1e9;
time_nanosleep($seconds, (int)$nanoseconds);
}
}
例外処理: time_nanosleepは、信号によって中断される場合があります。リターン値を処理するために、例外または割り込み検出を追加することをお勧めします。
高い並行性シナリオ:ポーリング方法は、高い並行性または遅延に敏感なタスクには適していません。 RabbitMQやRedisストリームなどのメッセージキューと組み合わせて使用することをお勧めします。
CPU占有制御:時限ポーリングは、一定量のCPU占有率を引き起こす可能性があり、リソース監視メカニズムを追加することをお勧めします。
PHPは通常、高精度タスクのスケジューリングには使用されていませんが、 Time_nanos Sleep機能の助けを借りて、簡潔で効果的なタスクポーリングメカニズムを構築することができます。上記の例は、特定のビジネスニーズに応じて拡張および最適化できる基本的なフレームワークを提供します。小規模で軽量のタスク管理シナリオでは、この方法は効率的で柔軟性があります。