219 votes

Obtenir le code HTTP en PHP avec curl

J'utilise CURL pour obtenir l'état d'un site, s'il est en service ou non ou s'il redirige vers un autre site. Je veux que cela soit aussi simple que possible, mais cela ne fonctionne pas bien.

<?php
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_TIMEOUT,10);
$output = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

return $httpcode;
?>

J'ai mis cela dans une fonction. Cela fonctionne bien mais les performances ne sont pas les meilleures parce qu'il télécharge la page entière, ce qui est le cas si je supprime la fonction $output = curl_exec($ch); il retourne 0 tout le temps.

Quelqu'un sait-il comment améliorer les performances ?

325voto

MoonLite Points 367

Vérifiez d'abord si l'URL est réellement valide (une chaîne de caractères, non vide, bonne syntaxe), ce qui est rapide à vérifier côté serveur. Par exemple, en faisant cela d'abord, on peut gagner beaucoup de temps :

if(!$url || !is_string($url) || ! preg_match('/^http(s)?:\/\/[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(\/.*)?$/i', $url)){
    return false;
}

Assurez-vous que vous ne récupérez que les en-têtes, et non le corps du texte :

@curl_setopt($ch, CURLOPT_HEADER  , true);  // we want headers
@curl_setopt($ch, CURLOPT_NOBODY  , true);  // we don't need body

Pour plus de détails sur l'obtention du code http du statut de l'URL, je vous renvoie à un autre article que j'ai rédigé (il est également utile pour suivre les redirections) :


Dans l'ensemble :

$url = 'http://www.example.com';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, true);    // we want headers
curl_setopt($ch, CURLOPT_NOBODY, true);    // we don't need body
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT,10);
$output = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo 'HTTP code: ' . $httpcode;

163voto

Deepika Patel Points 26
// must set $url first....
$http = curl_init($url);
// do your curl thing here
$result = curl_exec($http);
$http_status = curl_getinfo($http, CURLINFO_HTTP_CODE);
curl_close($http);
echo $http_status;

28voto

ntson1009 Points 401
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
$rt = curl_exec($ch);
$info = curl_getinfo($ch);
echo $info["http_code"];

18voto

Raphael Caixeta Points 3490

Essayez la fonction " get_headers fonction ".

Quelque chose du genre :

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

5voto

Mahendra Points 474

curl_getinfo - Obtenir des informations concernant un transfert spécifique

Vérifiez curl_getinfo

<?php
// Create a curl handle
$ch = curl_init('http://www.yahoo.com/');

// Execute
curl_exec($ch);

// Check if any error occurred
if(!curl_errno($ch))
{
 $info = curl_getinfo($ch);

 echo 'Took ' . $info['total_time'] . ' seconds to send a request to ' . $info['url'];
}

// Close handle
curl_close($ch);

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