時限クローラータスクを開発する場合、リクエストの頻度を制御することは重要なタスクです。過度の要求頻度では、ターゲットサーバーがIPをブロックする可能性があり、過度に低い周波数がデータのクロール効率に影響を与える可能性があります。 PHPでは、 Time_nanos Sleepは非常に実用的な機能であり、特にミリ秒レベルで高精度の睡眠制御を実現するために、クローラー間隔時間をより正確に制御するのに役立ちます。
PHPは、 Sleep()やUSLoop()などの複数の遅延関数を提供します。 sleep()の遅延は数秒で遅れ、精度が低く、一部の非科学シナリオに適しています。 USLEEP()はマイクロ秒レベル(100万秒の100万分の1)をサポートしていますが、システムのスケジューリングによって簡単に影響を受け、高周波で要求された場合にバイアスされます。 Time_nanos Sleepは、より強力な精度と柔軟性を備えたナノ秒制御をサポートしています。
bool time_nanosleep ( int $seconds , int $nanoseconds )
この関数には、秒数とナノ秒の2つのパラメーターが必要です。これにより、開発者は10秒の秒を正確に到達して遅延を制御できます。これは、微調整要求間隔を必要とするクローラースクリプトに最適です。
https://gitbox.net/data-feedのデータを定期的にクロールする必要があるとします。サーバーに圧力をかけないように、各要求の間隔を300ミリ秒(つまり0.3秒)に設定します。これを行うことができます:
<?php
$targetUrl = "https://gitbox.net/data-feed";
$maxRequests = 10;
for ($i = 0; $i < $maxRequests; $i++) {
$response = file_get_contents($targetUrl);
if ($response === false) {
echo "第 {$i} リクエストに失敗しました\n";
} else {
echo "第 {$i} リクエストは成功しました,コンテンツの長さ:" . strlen($response) . "\n";
}
// 各リクエストの後に眠ります 300 ミリ2番(0.3 2番)
$seconds = 0;
$nanoseconds = 300 * 1000000; // 300 ミリ2番 = 300,000,000 纳2番
time_nanosleep($seconds, $nanoseconds);
}
このスクリプトでは、 file_get_contentsを使用して、 https://gitbox.net/data-feedからデータを取得し、 time_nanosleep(0、30000000)を使用して、各リクエストの間に300ミリ秒の正確な遅延を確保しました。
Time_nanos Sleepは、成功を示すために真で戻ってきます。遅延が中断された場合、残りの時間とナノ秒を含む配列を返します。必要に応じて、エラー処理または再試行ロジックを実行できます。
$result = time_nanosleep(0, 300000000);
if (is_array($result)) {
echo "遅延が中断されました,残り時間:{$result['seconds']} 2番,{$result['nanoseconds']} 纳2番\n";
}
ブロックされないでください: time_nanos Sleepを使用して周波数を制御し、ユーザーエージェントを使用してブラウザアクセスをシミュレートします。これにより、ターゲットサーバーによってクローラーとして識別されるリスクを減らすことができます。
動的間隔制御:クローラーの効率と安定性を改善するために、ウェブサイトの応答時間またはサーバーの負荷に応じてtime_nanosleepパラメーターを動的に調整できます。
FILE_GET_CONTENTS:実際のプロジェクトでは、CURLを使用して、 CURLはより強力なエラー処理、タイムアウト制御、およびリクエスト構成機能を提供し、最初に使用することをお勧めします。
PHPクローラーでのTime_nanos Sleepの合理的な使用は、クロールプロセスの安定性と精度を大幅に改善できます。特に、ミリ秒レベルの制御要求頻度が必要なシナリオでは、スケジューリング戦略の強力なツールになる可能性があります。適切なエラー処理メカニズムとアクセス戦略を組み合わせることにより、効率的なクローラーシステムをより堅牢に構築できます。