PHP-curl: Wiederholung von gescheiterten curl-Anfragen
Curl ist ein nettes Tool und das auch in PHP-Scripts, um beispielsweise per Cronjob RSS-Feeds zu holen und diese dann zu verarbeiten und in Webseiten zu integrieren. Mitunter gibt die Zielwebseite jedoch etwas anderes als den gewünschten Feed und den Status-Code 200 aus. Bei einer problematischen Website, die periodisch einen 500er-Code ausgab, ließ sich partout der RSS-Feed nicht ziehen. Durch „händische“ Tests ergab sich, dass der 500er Code meist beim zweiten Versuch verschwand. Daher lässt sich der gewünschte Feed dann doch noch ziehen, wenn man es zwei oder drei Mal versucht.
In untenstehendem Script wird die Zahl der maximalen Versuche auf fünf beschränkt, um keine Endlosschleife zu verursachen. Eine Wiederholung findet statt, wenn der http_code
etwas anderes als 200
ist und vor dem ersten Versuch wird die Variable http_code
auf 500 gesetzt, damit es funktioniert. Jeder Durchlauf erhöht $i
um eins, bis zum i fünf erreicht oder der Statuscode 200 ist.
Mit print_r($data);
lässt sich beim Handbetrieb der aktuelle Inhalt von $data
ausgeben, um zu checken, was gerade wieder schief läuft.
Mittels $agent
lässt sich noch der USERAGENT von curl verändern, falls eventuell Curl gesperrt ist oder um wie im unten stehenden Beispiel dem Admin auf der anderen Seite — falls er oder sie die Logdateien nach lästigen Scripts scannt — die Möglichkeit für Beschwerden oder Rückfragen zu geben.
$answer
ist dann das Ergebnis der curl-Anfrage, die sich bequem weiterverarbeiten lässt.
$path = URL;
$data['http_code'] = 500;
$i = 1;
// $agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36';
// $agent = "curl/7.64.0";
$agent = 'Ganz harmloser RSS-Reader von xxxx. Keine Panik! Bei einem 500er-Fehler versucht er es noch vier Mal. Beschwerden an: mailadresse@xxxx';
while ($data['http_code'] <> 200 AND $i <= 5) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_URL,$path);
curl_setopt($ch, CURLOPT_FAILONERROR,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$answer = curl_exec($ch);
$data = curl_getinfo ($ch);
// print_r($data);
curl_close($ch);
}
Kommentare
Keine Kommentare
Kommentare