2009-07-14 8 views
4

Je dois créer une fonction qui retourne si une URL est joignable ou valide.Quel est le moyen le plus rapide pour déterminer si une URL existe en PHP?

J'utilise actuellement quelque chose comme ce qui suit pour déterminer une URL valide:

static public function urlExists($url) 
{ 
    $fp = @fopen($url, 'r'); 

    if($fp) 
    { 
     return true; 
    } 
    return false; 
} 

Il semble que il y aurait quelque chose de plus rapide, peut-être quelque chose qui vient alla chercher l'en-tête de la page ou quelque chose.

Répondre

7

Vous pouvez vérifier http status code.

Voici un code que vous pouvez utiliser pour vérifier qu'une url renvoie un code http 2xx ou 3xx pour s'assurer que l'url fonctionne.

<?php 

$url = "http://stackoverflow.com/questions/1122845"; 

function urlOK($url) 
{ 

    $url_data = parse_url ($url); 
    if (!$url_data) return FALSE; 

    $errno=""; 
    $errstr=""; 
    $fp=0; 

    $fp=fsockopen($url_data['host'],80,$errno,$errstr,30); 

    if($fp===0) return FALSE; 
    $path =''; 
    if (isset($url_data['path'])) $path .= $url_data['path']; 
    if (isset($url_data['query'])) $path .= '?' .$url_data['query']; 

    $out="GET /$path HTTP/1.1\r\n"; 
    $out.="Host: {$url_data['host']}\r\n"; 
    $out.="Connection: Close\r\n\r\n"; 

    fwrite($fp,$out); 
    $content=fgets($fp); 
    $code=trim(substr($content,9,4)); //get http code 
    fclose($fp); 
    // if http code is 2xx or 3xx url should work 
    return ($code[0] == 2 || $code[0] == 3) ? TRUE : FALSE; 
} 

echo $url; 
if (urlOK($url)) echo " is a working URL"; 
    else echo " is a bad URL"; 
?> 

Espérons que cela aide!

5

Vous serez probablement limité à l'envoi d'une sorte de requête HTTP. Ensuite, vous pouvez vérifier les codes de statut HTTP.

Veillez à envoyer uniquement une demande "HEAD", qui ne retire pas tout le contenu. Cela devrait être suffisant et assez léger.

11

Vous pouvez utiliser boucle comme suit:

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_NOBODY, true); // set to HEAD request 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // don't output the response 
curl_exec($ch); 
$valid = curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200; 
curl_close($ch); 
+2

Vérifiez également 2xx et 3xx car il peut être 301 déplacé définitivement ou un autre code http qui signifie que l'URL fonctionne. –

Questions connexes