Frage

Ich bringe mir einige grundlegenden Schaben und ich habe, dass manchmal die URL festgestellt, dass ich in meinen Code Rückkehr füttern 404, die alle für den Rest meines Code Zahnfleisch auf.

Also brauche ich einen Test an der Spitze des Codes zu überprüfen, ob die URL 404 zurückgibt oder nicht.

Das wäre wie eine ziemlich straightfoward Aufgabe scheinen, aber Google gibt mir keine Antwort. Ich sorge ich für die falschen Sachen zu suchen.

Ein Blog empfohlen Ich benutze diese:

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

und dann testen, ob $ gültig, wenn leer oder nicht zu sehen.

Aber ich denke, die URL, die mir Probleme ist gibt eine Umleitung auf sie, so $ gültig aufkommt leer für alle Werte. Oder vielleicht etwas anderes mache ich falsch.

Ich habe auch in eine „Kopf-Anforderung“ aussieht, aber ich habe noch keine aktuellen Code-Beispiele finden ich mit oder ausprobieren spielen können.

Verbesserungsvorschläge? Und was ist das über curl?

War es hilfreich?

Lösung

Wenn Sie mit PHP curl Bindungen , können Sie überprüfen, die Fehlercode mit curl_getinfo als solche:

$handle = curl_init($url);
curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);

/* 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. */
}

curl_close($handle);

/* Handle $response here. */

Andere Tipps

Wenn Sie Ihr Lauf php5 können Sie:

$url = 'http://www.example.com';
print_r(get_headers($url, 1));

Alternativ mit PHP4 einem Benutzer beigetragen hat folgende Möglichkeiten:

/**
This is a modified version of code from "stuart at sixletterwords dot com", at 14-Sep-2005 04:52. This version tries to emulate get_headers() function at PHP4. I think it works fairly well, and is simple. It is not the best emulation available, but it works.

Features:
- supports (and requires) full URLs.
- supports changing of default port in URL.
- stops downloading from socket as soon as end-of-headers is detected.

Limitations:
- only gets the root URL (see line with "GET / HTTP/1.1").
- don't support HTTPS (nor the default HTTPS port).
*/

if(!function_exists('get_headers'))
{
    function get_headers($url,$format=0)
    {
        $url=parse_url($url);
        $end = "\r\n\r\n";
        $fp = fsockopen($url['host'], (empty($url['port'])?80:$url['port']), $errno, $errstr, 30);
        if ($fp)
        {
            $out  = "GET / HTTP/1.1\r\n";
            $out .= "Host: ".$url['host']."\r\n";
            $out .= "Connection: Close\r\n\r\n";
            $var  = '';
            fwrite($fp, $out);
            while (!feof($fp))
            {
                $var.=fgets($fp, 1280);
                if(strpos($var,$end))
                    break;
            }
            fclose($fp);

            $var=preg_replace("/\r\n\r\n.*\$/",'',$var);
            $var=explode("\r\n",$var);
            if($format)
            {
                foreach($var as $i)
                {
                    if(preg_match('/^([a-zA-Z -]+): +(.*)$/',$i,$parts))
                        $v[$parts[1]]=$parts[2];
                }
                return $v;
            }
            else
                return $var;
        }
    }
}

Beide müßten ein ähnliches Ergebnis wie:

Array
(
    [0] => HTTP/1.1 200 OK
    [Date] => Sat, 29 May 2004 12:28:14 GMT
    [Server] => Apache/1.3.27 (Unix)  (Red-Hat/Linux)
    [Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT
    [ETag] => "3f80f-1b6-3e1cb03b"
    [Accept-Ranges] => bytes
    [Content-Length] => 438
    [Connection] => close
    [Content-Type] => text/html
)

Daher könnten Sie einfach überprüfen, um zu sehen, dass die Header-Antwort war OK zB:

$headers = get_headers($url, 1);
if ($headers[0] == 'HTTP/1.1 200 OK') {
//valid 
}

if ($headers[0] == 'HTTP/1.1 301 Moved Permanently') {
//moved or redirect page
}

W3C Codes und Definitionen

Mit strager Code, können Sie auch die CURLINFO_HTTP_CODE für andere Codes überprüfen. Einige Websites berichten nicht 404, sondern einfach sie auf eine benutzerdefinierte 404-Seite umleiten und zurück 302 (Redirect) oder etwas ähnliches. Früher habe ich dies zu überprüfen, ob eine tatsächliche Datei (zB robots.txt.) Auf dem Server vorhanden ist oder nicht. Offensichtlich ist diese Art von Datei würde eine Umleitung nicht verursachen, wenn es existiert, aber wenn es nicht täte, würde es zu einer 404-Seite umgeleitet, die wie gesagt nicht einen 404-Code.

function is_404($url) {
    $handle = curl_init($url);
    curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);

    /* 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);
    curl_close($handle);

    /* If the document has loaded successfully without any redirection or error */
    if ($httpCode >= 200 && $httpCode < 300) {
        return false;
    } else {
        return true;
    }
}

Wie strager schlägt vor, schauen Sie in cURL. Sie können auch bei der Einrichtung CURLOPT_NOBODY mit curl_setopt interessiert sein, das Ganze zu überspringen Download Seite (Sie wollen nur die Header).

Wenn Sie suchen eine einfachste Lösung und man kann Sie in einem Rutsch auf php5 versuchen zu tun

file_get_contents('www.yoursite.com');
//and check by echoing
echo $http_response_header[0];

Ich fand diese Antwort 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 Grunde verwenden Sie die „Datei erhalten Inhalt“ Methode, um die URL abzurufen, die die HTTP-Antwort-Header-Variable mit dem Statuscode automatisch auffüllt.

Nachtrag; getestet jene drei Methoden unter Berücksichtigung Leistung

.

Das Ergebnis, zumindest in meiner Testumgebung:

Locke gewinnt

Dieser Test wird unter der Berücksichtigung durchgeführt, die nur die Header (nobody) benötigt werden. Testen Sie sich 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>";

Als ein zusätzlicher Hinweis auf die große akzeptierte Antwort:

Wenn eine Änderung der vorgeschlagenen Lösung, habe ich Fehler wegen PHP-Einstellung ‚max_execution_time‘. Also, was ich tat, war die folgende:

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 die Frist auf eine höhere Anzahl von Sekunden, am Ende setze ich sie auf den Wert zurück in den PHP-Einstellungen definiert sind.

<?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;
?>

Dies wird Ihnen wahr, 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;
}

Sie können diesen Code verwenden, auch den Status eines 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');
?>

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 application/rdf+xml ändern, was auch immer Sie verwenden.

Dies ist nur und Stück Code, Hoffnung für Sie arbeitet

            $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'];

Um alle Fehler zu fangen: 4XX- und 5XX, ich benutze dieses kleine Skript:

function URLIsValid($URL){
    $headers = @get_headers($URL);
    preg_match("/ [45][0-9]{2} /", (string)$headers[0] , $match);
    return count($match) === 0;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top