Obtenir du Code HTTP en PHP en utilisant curl

j'utilise CURL pour obtenir le statut d'un site, s'il est up/down ou redirecting vers un autre site. Je veux que ce soit aussi simple que possible, mais ça ne marche 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 ceci enveloppé dans une fonction. Il fonctionne très bien, mais la performance n'est pas la meilleure parce qu'il télécharge l'ensemble de la page, chose si je supprime $output = curl_exec($ch); il retourne 0 tout le temps.

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

117
demandé sur halfer 2012-08-03 18:27:34

7 réponses

assurez-vous D'abord que si L'URL est réellement valide (une chaîne, pas vide, bonne syntaxe), ceci est rapide pour vérifier côté serveur. Par exemple, faire cela d'abord pourrait sauver 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, 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 de l'état de L'URL, je me réfère à un autre post que j'ai fait (il aide également avec les redirections suivantes):


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;
160
répondu MoonLite 2018-07-13 16:14: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;
79
répondu Deepika Patel 2015-02-10 09:14:44

Essayer de PHP " get_headers fonction".

quelque chose du genre:

<?php
    $url = 'http://www.example.com';
    print_r(get_headers($url));
    print_r(get_headers($url, 1));
?>
15
répondu Raphael Caixeta 2012-08-03 14:30:38
$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"];
12
répondu ntson1009 2016-02-09 13:49:04

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

2
répondu Explosion Pills 2012-08-03 14:30:41

curl_getinfo - obtenir des informations concernant 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);
2
répondu Mahendra Jella 2015-07-02 05:49:14

voici ma solution besoin obtenir L'état Http pour vérifier l'état du serveur régulièrement

$url = 'http://www.example.com'; // Your server link

while(true) {

    $strHeader = get_headers($url)[0];

    $statusCode = substr($strHeader, 9, 3 );

    if($statusCode != 200 ) {
        echo 'Server down.';
        // Send email 
    }
    else {
        echo 'oK';
    }

    sleep(30);
}
0
répondu christian Nguyen 2016-08-13 13:40:33