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?
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;
// 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;
$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"];
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));
?>
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);
curl_exec
est nécessaire. Essayez CURLOPT_NOBODY
pour ne pas télécharger le corps. Cela pourrait être plus rapide.