Frage

eine Liste von URLs angegeben, würde Ich mag, dass jede URL überprüfen:

  • Gibt einen Statuscode 200 OK
  • Gibt eine Antwort innerhalb von X Höhe der Zeit

Das Endziel ist ein System, das von nachlass Urls als potenziell gebrochen, so dass ein Administrator sie in der Lage ist, überprüfen kann.

Das Skript wird in PHP und wird höchstwahrscheinlich laufen auf täglicher Basis über cron geschrieben werden.

Das Skript wird etwa 1000 Urls bei einem Go werden verarbeitet.

Frage hat zwei Teile:

  • Gibt es bigtime gotchas mit einer Operation wie diese, welche Themen haben Sie laufen in?
  • Was ist die beste Methode, den Status einer URL in PHP für die Überprüfung sowohl Genauigkeit und Leistung unter Berücksichtigung?
War es hilfreich?

Lösung

Mit der PHP-Erweiterung cURL. Im Gegensatz zu fopen () kann es auch HTTP HEAD-Anfragen stellen, die ausreichend sind, um die Verfügbarkeit einer URL zu überprüfen und Ihnen eine Menge Bandbreite speichern, wie Sie müssen nicht der gesamte Körper von der Seite herunterladen zu überprüfen.

Als Ausgangspunkt Sie einige Funktion wie diese verwenden:

function is_available($url, $timeout = 30) {
    $ch = curl_init(); // get cURL handle

    // set cURL options
    $opts = array(CURLOPT_RETURNTRANSFER => true, // do not output to browser
                  CURLOPT_URL => $url,            // set URL
                  CURLOPT_NOBODY => true,         // do a HEAD request only
                  CURLOPT_TIMEOUT => $timeout);   // set timeout
    curl_setopt_array($ch, $opts); 

    curl_exec($ch); // do it!

    $retval = curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200; // check if HTTP OK

    curl_close($ch); // close handle

    return $retval;
}

Allerdings gibt es eine Tonne möglicher Optimierungen: Sie mögen vielleicht neu verwenden, um die cURL-Instanz und, wenn mehr als eine URL pro Host überprüft, auch wiederverwenden die Verbindung

.

Oh, und dieser Code nicht überprüft ausschließlich für HTTP-Antwortcode 200. Es folgt nicht Umleitungen (302) -, aber es gibt auch eine cURL-Option für die

.

Andere Tipps

in Curl-Look. Es gibt eine Bibliothek für PHP.

Es gibt auch eine ausführbare Version cURL, so dass Sie auch das Skript in Bash schreiben können.

Ich schrieb tatsächlich etwas in PHP, die diese über eine Datenbank unterstützt von 5k + URLs. Ich benutzte die PEAR-Klasse HTTP_Request , unt Methode aufgerufen getResponseCode (). Ich iterieren nur über die URLs, um sie zu getResponseCode vorbei und bewerten die Antwort.

Allerdings funktioniert es nicht für FTP-Adressen, URLs, die mit http oder https nicht beginnen (unbestätigt, aber ich glaube, es ist der Fall), und Websites mit ungültigen Sicherheitszertifikaten (ein 0 nicht gefunden). Außerdem wird ein 0 zurückgegeben für Server-not-found (es gibt keinen Statuscode für die).

Und es ist wahrscheinlich einfacher als cURL, wie Sie ein paar Dateien enthalten und eine einzige Funktion wieder einen Integer-Code zu erhalten.

  1. fopen () unterstützt http URI.
  2. Wenn Sie mehr Flexibilität (wie Timeout) benötigen, schauen Sie in die Curl-Erweiterung.

Es scheint, als wäre es ein Job für curl .

Wenn Sie nicht stecken auf PHP Perl LWP könnte auch eine Antwort sein.

Sie sollten sich auch bewusst von URLs sein Rückkehr 301 oder 302 HTTP-Antworten, die auf eine andere Seite umgeleitet werden. Im Allgemeinen bedeutet dies nicht der Link ungültig ist. Zum Beispiel http://amazon.com liefert 301 und leitet auf http://www.amazon.com/ .

Nur eine 200-Antwort Rückkehr ist nicht genug; viele gültigen Links werden weiterhin „200“ zurückzukehren, nachdem sie in Porno / Glücksspiel-Portale ändern, wenn der frühere Eigentümer zu erneuern ausfällt.

Domain Hausbesetzer der Regel sicher, dass jede URL in ihren Domänen 200 zurück.

Ein mögliches Problem Sie undoubtably in ist ausgeführt, wenn das Feld dieses Skript ausgeführt Zugang zum Internet verliert ... werden Sie 1000 Fehlalarme auslösen.

Es wäre wahrscheinlich besser für Ihren Skript eine Art von Geschichte zu halten und nur einen Fehler nach 5 Tagen des Scheiterns melden.

Auch sollte das Skript Selbstprüfung in irgendeiner Weise sein (wie eine bekannte gute Website-Prüfung [google?]), Bevor sie mit den Standardprüfungen fort.

Sie müssen nur einen Bash-Skript, dies zu tun. Bitte überprüfen Sie meine Antwort auf eine ähnliche Position hier . Es ist ein Einzeiler, die HTTP-Verbindungen wieder verwendet dramatisch Geschwindigkeit zu verbessern, wiederholt n-mal für temporäre Fehler und folgt Umleitungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top