162 votes

Un moyen simple de tester une URL pour 404 en PHP ?

Je suis en train de m'initier au scraping et j'ai constaté que parfois les URL que j'introduis dans mon code renvoient 404, ce qui gomme tout le reste de mon code.

J'ai donc besoin d'un test en haut du code pour vérifier si l'URL renvoie 404 ou non.

Cela semble être une tâche assez simple, mais Google ne me donne aucune réponse. J'ai peur de chercher les mauvaises choses.

Un blog m'a recommandé d'utiliser ceci :

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

et ensuite tester pour voir si $valid est vide ou non.

Mais je pense que l'URL qui me pose problème a une redirection, donc $valid est vide pour toutes les valeurs. Ou peut-être que je fais quelque chose d'autre de mal.

J'ai également cherché une "demande principale", mais je n'ai pas encore trouvé d'exemples concrets de code avec lesquels je puisse jouer ou que je puisse essayer.

Des suggestions ? Et c'est quoi cette histoire de boucles ?

1voto

Solutioner Points 577

Vous pouvez également utiliser ce code pour connaître le statut de n'importe quel lien :

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

0voto

Erwan Sabourin Points 36

Pour attraper toutes les erreurs : 4XX et 5XX, j'utilise ce petit script :

function URLIsValid($URL){
    $headers = @get_headers($URL);
    preg_match("/ [45][0-9]{2} /", (string)$headers[0] , $match);
    return count($match) === 0;
}

0voto

Ceci n'est qu'une partie du code, J'espère que cela fonctionnera pour vous.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X