Bei der Entwicklung zeitgesteuerter Crawler -Aufgaben ist die Kontrolle der Häufigkeit von Anforderungen eine entscheidende Aufgabe. Eine übermäßige Anfragefrequenz kann dazu führen, dass der Zielserver die IP blockiert, und übermäßig niedrige Häufigkeit kann die Datenkriecheneffizienz beeinflussen. In PHP ist Time_nanoSleep eine sehr praktische Funktion, die uns hilft, die Crawler-Intervallzeit genauer zu kontrollieren, insbesondere um eine hochpräzierende Schlafkontrolle auf Millisekundenebene zu erreichen.
PHP bietet mehrere Verzögerungsfunktionen wie Sleep () und us im Sleep () . Sleep () Verzögerungen in Sekunden, haben eine geringe Genauigkeit und eignen sich für einige Nicht-Verschreibungsszenarien. Obwohl usleep () den Mikrosekundenstuf (eine Millionstel einer Sekunde) unterstützt, kann dies leicht von der Systemplanung beeinflusst und bei hoher Frequenz voreingenommen. TIME_NANOSSEEP unterstützt die Nanosekundenkontrolle mit stärkerer Genauigkeit und Flexibilität:
bool time_nanosleep ( int $seconds , int $nanoseconds )
Diese Funktion dauert zwei Parameter: Sekunden und Nanosekunden, sodass Entwickler eine Milliardenstel einer Sekunde genau erreichen können, um Verzögerungen zu kontrollieren, was ideal für Crawler-Skripte ist, für die feinabstimmige Anforderungsintervalle erforderlich sind.
Angenommen, wir möchten regelmäßig Daten von https://gitbox.net/data-feed kriechen. Um nicht Druck auf den Server auszuüben, setzen wir das Intervall jeder Anfrage auf 300 Millisekunden (d. H. 0,3 Sekunden). Wir können das tun:
<?php
$targetUrl = "https://gitbox.net/data-feed";
$maxRequests = 10;
for ($i = 0; $i < $maxRequests; $i++) {
$response = file_get_contents($targetUrl);
if ($response === false) {
echo "1. {$i} Die Anfrage ist fehlgeschlagen\n";
} else {
echo "1. {$i} Die Anfrage war erfolgreich,Inhaltslänge:" . strlen($response) . "\n";
}
// Schlafen nach jeder Anfrage 300 Millisekunde(0.3 Zweite)
$seconds = 0;
$nanoseconds = 300 * 1000000; // 300 Millisekunde = 300,000,000 纳Zweite
time_nanosleep($seconds, $nanoseconds);
}
In diesem Skript haben wir File_Get_Contents verwendet, um nur Daten von https://gitbox.net/data-feed zu holen und time_nanosleeeap (0, 30000000) zu verwenden, um eine genaue Verzögerung von 300 Millisekunden zwischen jeder Anforderung zu gewährleisten.
time_nanosleeep kehrt treu zurück, um den Erfolg anzuzeigen; Wenn die Verzögerung unterbrochen wird, wird ein Array mit der verbleibenden Zeit von Sekunden und Nanosekunden zurückgegeben. Wir können bei Bedarf Fehlerbehandlungen oder Wiederholung der Logik durchführen:
$result = time_nanosleep(0, 300000000);
if (is_array($result)) {
echo "Verzögerung unterbrochen,übrige Zeit:{$result['seconds']} Zweite,{$result['nanoseconds']} 纳Zweite\n";
}
Vermeiden Sie es, blockiert zu werden : Verwenden Sie Time_nanosleeep , um die Frequenz zu steuern und den Browserzugriff mit Benutzeragent zu simulieren, um das Risiko zu verringern, vom Zielserver als Crawler identifiziert zu werden.
Dynamische Intervallsteuerung : Sie können die Parameter Time_nanoSleep dynamisch gemäß der Reaktionszeit der Website oder der Serverlast anpassen, um die Crawler -Effizienz und -stabilität zu verbessern.
Verwenden Sie Curl anstelle von File_Get_Contents : In den tatsächlichen Projekten bietet Curl eine stärkere Fehlerbehandlung, Zeitüberschreitungs- und Anforderungskonfigurationsfunktionen, und es wird empfohlen, es zuerst zu verwenden.
Der vernünftige Einsatz von Time_Nanosleep in PHP -Crawlern kann die Stabilität und Genauigkeit des Kriechprozesses erheblich verbessern. Insbesondere in Szenarien, in denen eine Steueranfrage auf Millisekunden-Ebene erforderlich ist, kann sie zu einem leistungsstarken Tool in Ihrer Planungsstrategie werden. Durch die Kombination eines guten Fehlermechanismus und Zugangsstrategie können wir ein effizienteres Crawler -System robuster aufbauen.