Http Status Code mit PHP auslesen

von Nils Langner am 4. Mai 2009

Heute mal wieder was aus der Praxis,  mal wieder etwas mit Code. Da ich derzeit im Qualitätsmanagement arbeite hat man natürlich eine ganz andere Sicht auf Projekte. Viel Code kommt da nicht mehr zusammen. Letzte Woche hatte ich aber mal wieder ein Anliegen, das ich in PHP verpacken wollte. Meine Anforderungen kann man ja schon aus dem Titel erkennen, ich fasse sie aber trotzdem schnell zusammen.

Ich habe eine Reihe von Webseiten, die für mich eine Black Box sind. Jetzt würde ich gerne rausfinden, ob sie den richtigen HTTP Status Code zurückliefern, denn auch wenn man im Browser alles korrekt eingezeigt bekommt, kann es sein, dass ein 404er im Header angezeigt wird. Für uns Anwender ist das eigentlich ziemlich egal, die Suchmaschinen oder besser die Suchmaschine wird diese Seite aber nicht in den Index mit ausnehmen. Das Testen auf den richtigen Status kann also relativ wichtig sein, wenn man seine Seiten gut positionieren will.

Die meisten PHP Methoden, wie fgets, file oder file_get_contens, kümmern sich nur um den Content eines Http Requests, der Header bleibt hierbei außen vor. Zusätzlich ist es meistens auch nicht erlaubt diese für den Zugriff auf externe Dateien zu verwenden. Hier hilft uns aber ein immer wieder gern verwendetes PHP Modul cURL. cURL ist eigentlich ähnlich zu wget, das ihr wohl alle kennt. Ich kann Dateien aus dem Internet laden, ohne dabei einen Browser verwenden zu müssen.

Gehen wir also davon aus, dass wir cURL installiert haben und es verwenden können. Dann würde unsere Funktion wie folgt aussehen.

public static function getHttpCode( $url )
{
    $ch = curl_init();

    // set URL and other appropriate options
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    curl_exec($ch);
    $info = curl_getinfo($ch);
    curl_close($ch);

    return $info['http_code'];
}

Kein Hexenwerk würde ich mal sagen, trotzdem habe ich in meiner $info Variablen alle Informationen, die ich brauche, um meine Anfrage auf Korrektheit zu überprüfen. Ihr könnt auch diesen Array ja mal genauer ansehen, vielleicht braucht ihr das ein oder andere Element noch an einer anderen Stelle.

Diese Funktion solltet ihr einfach einmak täglich über eure Sitemap laufen lassen, in der Hoffnung, dass ihr kaputte Dateien vor Google findet.

Nils Langner Nils Langner

Auch wenn Ihr es mir nicht glauben werdet, aber ich habe nichts gegen PHP. Ich rege mich einfach nur gerne auf. Ok so schlimm ist es auch nicht. Eigentlich wollte ich schon immer einen Blog haben und da ...

Zum Profil von Nils Langner

14 Kommentare »


  • Kore
    am 4. Mai 2009 um 06:53 Uhr

    Das geht auch genauso gut mit dem PHP-stream-wrapper – zumindest ab PHP 5.3:

    $fp = fopen( ‘http://example.com’ );
    var_dump( stream_get_meta_data( $fp ) );

    Und ueber die stream-context-Optionen lassen sich ja sowieso request-type, und weitere Optionen definieren.


  • Nils Langner
    am 4. Mai 2009 um 07:43 Uhr

    Moin Kore, da würde ich doch mal sagen, dass ich wieder einen neuen Grund gefunden habe, mich auf 5.3 zu freuen. Nur leider bin ich mir sicher, dass es noch eine Weile dauert, bis wir es im Produktiveinsatz bei uns verwenden werden. Aber hier im Blog wird PHP 5.3 wohl eine Menge neue Artikel produzieren.


  • Wolfgang
    am 4. Mai 2009 um 07:43 Uhr

    Wie Johannes neulich hier geschrieben hat ginge das Auslesen der HTTP-Response-Headers auch mit der globalen Variable $http_response_header nach z.B. file_get_contents($url) (falls man mal das cURL-Modul nicht zur Hand hat).


  • Wolfgang
    am 4. Mai 2009 um 07:46 Uhr

    Ups, zu langsam :) Auf php.net steht allerdings nichts dazu ab welcher PHP-Version es $http_response_header gibt.


  • unset
    am 4. Mai 2009 um 08:19 Uhr

    Der ZF HTTP-Client bietet sich übrigens als toller Wrapper an, der verschiedene Implementationen als Adapter zulässt. Auch schön einfach. Hab ich hier neulich noch benutzt: http://phphacker.net/2009/04/27/das-experiment-wordpress-security-und-das-zend-framework/


  • Http Status Code mit PHP auslesen
    am 4. Mai 2009 um 08:43 Uhr

    [...] morgen bin ich über diesen Beitrag auf phphatesme.com gestolpert. Die dort präsentierte Lösung public static function getHttpCode( [...]


  • Dominik Jungowski
    am 4. Mai 2009 um 09:12 Uhr

    Das ganze geht übrigens noch viel einfacher mit der Funktion get_headers() ;-)

    Siehe hier: http://de.php.net/get_headers


  • Nils Langner
    am 4. Mai 2009 um 09:47 Uhr

    @Dominik: Da warst du leider 30min zu spät ;) Der Pingback war schneller. Aber ich bin froh, dass ich das ganze in eine Funktion gekapselt habe und ich es jetzt ohne Probleme austauschen kann ;)


  • unset
    am 4. Mai 2009 um 09:54 Uhr

    Was für ein HTTP-Request setzt get_headers() denn ab? Das wird irgendwie nirgends erwähnt. Denn: In meinem verlinkten Post musste ich die Feststellung machen, dass ein paar Applikationen auf einen HEAD-Request mit einem forbidden antworten. Andere wiederum liefern Schrott aus, wenn kein Bekannter User-Agent gesetzt ist (oder schlimmer: Wenn PHP als User-Agent daherkommt).


  • Tobias
    am 4. Mai 2009 um 12:41 Uhr

    Wie wäre es einen Socket mit fsockopen zu erstellen und dann den HTTP-Request zu senden?
    Man ist unabhängig von Curl und kann mit jedem Header rumspielen wie man will.


  • Nils Langner
    am 4. Mai 2009 um 12:51 Uhr

    @Tobias: Klar, das mag wohl gehen, aber würde man hier nicht das Rad neu erfinden?


  • Dominic
    am 4. Mai 2009 um 15:19 Uhr

    Wenn man dann noch die Funktion get_headers( $url ); erweitert, also einen weiteren parameter anhängt get_headers( $url, 1 );, werden die keys mit dem Namen besetzt anstelle von Indexzahlen (also anstelle von [1] => ‘text/xml’ steht dort nun [Content-Type] => ‘text/xml’). Hilft zB sehr bei debuggen mit print_r oder var_dump.

    So kommt man auch nicht unbedingt durcheinander, da nciht alle server alles in der immer gleichen reihenfolge zurücschicken.

    Abgesehen davon funktioniert das erst ab PHP 5… leider. Ansonten halt den curkl code nehmen.


  • Nils Langner
    am 4. Mai 2009 um 18:22 Uhr

    ich glaube ich schreibe heute Abend noch einen Artikel “Die 120 Methoden einen HTTP Header auszulesen”. Ich veröffentliche den dann aber erst in 4 Wochen oder so, dann denken alle, die Ideen kamen von mir ;)


  • Tobias
    am 5. Mai 2009 um 09:00 Uhr

    Gib uns die 4 Wochen Zeit und wir finden noch mehr als 120 Möglichkeiten *gg*

RSS-Feed für Kommentare zu diesem Artikel. TrackBack-URL

Einen Kommentar hinterlassen

Werbung
PHP Magazin
Ausgabe 02/2010

Dieses Mal mit Artikeln zu den Themen Silverlight 3, MySQLDUmper, Doctrine.

t3n
Ausgabe 19

Social Media (R)evolution. Weitere Themen sind noSQL, Crowdsourcing ...

PHP Journal
Ausgabe 1/2010

PHP Frameworks optimal nutzen, Workshops für PHP Profis, Typo3 auf dem Weg zu Version 5.