Linuxspicker

Admins kleiner Zettelkasten für die Lösung von Linuxproblemen

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);	
    }


Stichworte: , ,
Kategorien:


Kommentare

Keine Kommentare

Kommentare

Geben Sie Ihren Kommentar hier ein. * Eingabe erforderlich. Sie müssen die Vorschau vor dem Absenden ansehen.