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?

8voto

Sebastian Viereck Punkte 4765

Diese Funktion gibt den Statuscode einer URL in PHP 7 zurück:

/**
 * @param string $url
 * @return int
 */
function getHttpResponseCode(string $url): int
{
    $headers = get_headers($url);
    return substr($headers[0], 9, 3);
}

Beispiel:

echo getHttpResponseCode('https://www.google.com');
//displays: 200

7voto

Ross Punkte 9248

Ich habe diese Antwort gefunden hier :

if(($twitter_XML_raw=file_get_contents($timeline))==false){
    // Retrieve HTTP status code
    list($version,$status_code,$msg) = explode(' ',$http_response_header[0], 3);

    // Check the HTTP Status code
    switch($status_code) {
        case 200:
                $error_status="200: Success";
                break;
        case 401:
                $error_status="401: Login failure.  Try logging out and back in.  Password are ONLY used when posting.";
                break;
        case 400:
                $error_status="400: Invalid request.  You may have exceeded your rate limit.";
                break;
        case 404:
                $error_status="404: Not found.  This shouldn't happen.  Please let me know what happened using the feedback link above.";
                break;
        case 500:
                $error_status="500: Twitter servers replied with an error. Hopefully they'll be OK soon!";
                break;
        case 502:
                $error_status="502: Twitter servers may be down or being upgraded. Hopefully they'll be OK soon!";
                break;
        case 503:
                $error_status="503: Twitter service unavailable. Hopefully they'll be OK soon!";
                break;
        default:
                $error_status="Undocumented error: " . $status_code;
                break;
    }

Im Wesentlichen verwenden Sie die Methode "file get contents", um die URL abzurufen, die automatisch die http-Antwortkopfvariable mit dem Statuscode auffüllt.

7voto

Juergen Punkte 1314

Dies gibt Ihnen true, wenn url nicht 200 OK zurückgibt

function check_404($url) {
   $headers=get_headers($url, 1);
   if ($headers[0]!='HTTP/1.1 200 OK') return true; else return false;
}

6voto

Email Punkte 2357

Addendum;testete diese 3 Methoden hinsichtlich ihrer Leistung.

Das Ergebnis, zumindest in meiner Testumgebung:

Locke gewinnt

Dieser Test wird unter der Annahme durchgeführt, dass nur die Kopfzeile (noBody) benötigt wird. Testen Sie selbst:

$url = "http://de.wikipedia.org/wiki/Pinocchio";

$start_time = microtime(TRUE);
$headers = get_headers($url);
echo $headers[0]."<br>";
$end_time = microtime(TRUE);
echo $end_time - $start_time."<br>";

$start_time = microtime(TRUE);
$response = file_get_contents($url);
echo $http_response_header[0]."<br>";
$end_time = microtime(TRUE);
echo $end_time - $start_time."<br>";

$start_time = microtime(TRUE);
$handle = curl_init($url);
curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($handle, CURLOPT_NOBODY, 1); // and *only* get the header 
/* Get the HTML or whatever is linked in $url. */
$response = curl_exec($handle);
/* Check for 404 (file not found). */
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
// if($httpCode == 404) {
    // /* Handle 404 here. */
// }
echo $httpCode."<br>";
curl_close($handle);
$end_time = microtime(TRUE);
echo $end_time - $start_time."<br>";

4voto

Andreas Punkte 818

Hier ist eine kurze Lösung.

$handle = curl_init($uri);
curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($handle,CURLOPT_HTTPHEADER,array ("Accept: application/rdf+xml"));
curl_setopt($handle, CURLOPT_NOBODY, true);
curl_exec($handle);
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
if($httpCode == 200||$httpCode == 303) 
{
    echo "you might get a reply";
}
curl_close($handle);

In Ihrem Fall können Sie Folgendes ändern application/rdf+xml auf das, was Sie verwenden.

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