web-dev-qa-db-fra.com

Obtenir le code HTTP dans PHP en utilisant curl

J'utilise CURL pour obtenir le statut d'un site, s'il est actif/négatif ou s'il est redirigé vers un autre site. Je veux que ce 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;
?>

Je l'ai enveloppé dans une fonction. Cela fonctionne bien mais les performances ne sont pas les meilleures car il télécharge la page entière. Si je supprime $output = curl_exec($ch);, il retourne 0 tout le temps.

Est-ce que quelqu'un sait comment améliorer la performance?

151
Aaran McGuire

Premièrement, assurez-vous que si l'URL est réellement valide (une chaîne, pas une chaîne vide, une bonne syntaxe), la vérification côté serveur est rapide. Par exemple, faire ceci en premier permettrait de 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 de ne récupérer que les en-têtes, pas le contenu du corps:

@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 d'état de l'URL, je renvoie à un autre message que j'ai publié (il est également utile de suivre les redirections):


Dans son 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;
219
MoonLite
// 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;
112
Deepika Patel
$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"];
21
ntson1009

Essayez la fonction " get_headers " de PHP.

Quelque chose dans le genre de:

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

curl_getinfo - Obtenir des informations sur un transfert spécifique

Vérifier 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);
4
Lead Developer

curl_exec est nécessaire. Essayez CURLOPT_NOBODY pour ne pas télécharger le corps. Cela pourrait être plus rapide.

2
Explosion Pills