168 Stimmen

Einfacher Weg, um eine URL für 404 in PHP zu testen?

Ich bringe mir gerade einige grundlegende Scraping-Funktionen bei und habe festgestellt, dass die URLs, die ich in meinen Code eingebe, manchmal 404 zurückgeben, was den Rest meines Codes blockiert.

Ich brauche also einen Test am Anfang des Codes, um zu prüfen, ob die URL 404 zurückgibt oder nicht.

Das scheint eine ziemlich einfache Aufgabe zu sein, aber Google gibt mir keine Antworten. Ich befürchte, dass ich nach den falschen Dingen suche.

Ein Blog empfahl mir, dies zu verwenden:

$valid = @fsockopen($url, 80, $errno, $errstr, 30);

und dann prüfen, ob $valid leer ist oder nicht.

Aber ich denke, die URL, die mir Probleme gibt, hat eine Umleitung auf es, so $valid kommt leer für alle Werte. Oder vielleicht tue ich etwas anderes falsch.

Ich habe mich auch mit einem "Head Request" beschäftigt, aber ich habe noch keine konkreten Codebeispiele gefunden, mit denen ich spielen oder die ich ausprobieren könnte.

Vorschläge? Und was hat es mit der Locke auf sich?

2voto

markus Punkte 39397

Ein zusätzlicher Hinweis auf die allgemein akzeptierte Antwort:

Bei der Verwendung einer Variante der vorgeschlagenen Lösung, bekam ich Fehler wegen der php-Einstellung "max_execution_time". Also habe ich folgendes getan:

set_time_limit(120);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_NOBODY, true);
$result = curl_exec($curl);
set_time_limit(ini_get('max_execution_time'));
curl_close($curl);

Zuerst habe ich das Zeitlimit auf eine höhere Anzahl von Sekunden gesetzt, am Ende habe ich es auf den in den php-Einstellungen definierten Wert zurückgesetzt.

2voto

<?php

$url= 'www.something.com';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, true);   
curl_setopt($ch, CURLOPT_NOBODY, true);    
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.4");
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT,10);
curl_setopt($ch, CURLOPT_ENCODING, "gzip");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$output = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo $httpcode;
?>

1voto

T.Todua Punkte 48569

Sie können diesen Code auch verwenden, um den Status eines beliebigen Links zu sehen:

<?php

function get_url_status($url, $timeout = 10) 
{
$ch = curl_init();
// 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!
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE); // find HTTP status
curl_close($ch); // close handle
echo $status; //or return $status;
    //example checking
    if ($status == '302') { echo 'HEY, redirection';}
}

get_url_status('http://yourpage.comm');
?>

1voto

Hier ist ein Weg!

<?php

$url = "http://www.google.com";

if(@file_get_contents($url)){
echo "Url Exists!";
} else {
echo "Url Doesn't Exist!";
}

?>

Dieses einfache Skript stellt einfach eine Anfrage an die URL für den Quellcode. Wenn die Anfrage erfolgreich abgeschlossen wird, gibt es "URL Exists!" aus. Wenn nicht, gibt es "URL Doesn't Exist!" aus.

0voto

Dies ist nur ein Ausschnitt aus dem Code, Hoffnung funktioniert für Sie

            $ch = @curl_init();
            @curl_setopt($ch, CURLOPT_URL, 'http://example.com');
            @curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1");
            @curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            @curl_setopt($ch, CURLOPT_TIMEOUT, 10);

            $response       = @curl_exec($ch);
            $errno          = @curl_errno($ch);
            $error          = @curl_error($ch);

                    $response = $response;
                    $info = @curl_getinfo($ch);
return $info['http_code'];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X