Obtenir du code HTTP en PHP en utilisant curl

178

J'utilise CURL pour obtenir le statut d'un site, s'il est en haut / en bas ou en redirection 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 ceci enveloppé dans une fonction. Cela fonctionne bien mais les performances ne sont pas les meilleures car il télécharge la page entière, chose si je le supprime, $output = curl_exec($ch);il revient 0tout le temps.

Quelqu'un sait-il comment améliorer la performance?

Aaran McGuire
la source

Réponses:

260

Assurez-vous d'abord que l'URL est réellement valide (une chaîne, non vide, bonne syntaxe), c'est rapide à vérifier côté serveur. Par exemple, faire ceci en premier pourrait vous faire 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 me réfère à un autre message que j'ai publié (cela aide également avec les redirections suivantes):


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;
MoonLite
la source
4
J'ai édité votre message et collé le code d'exemple de travail dans son ensemble. Je trouve cela plus utile. Btw., +1 pour avoir mentionné les paramètres CURLOPT_HEADER et CURLOPT_NOBODY! :)
Sk8erPeter
25
Il n'est pas nécessaire de définir CURLOPT_HEADER sur true. Vous obtenez toujours le httpcode de curl_getinfo () de toute façon.
Brainware
7
Depuis PHP 5.5.0 et cURL 7.10.8, ce [CURLINFO_HTTP_CODE] est un ancien alias de CURLINFO_RESPONSE_CODE ( ref )
sshow le
Pour une raison quelconque, cette ligne curl_setopt($ch, CURLOPT_NOBODY, true);est suspendue. Je ne sais pas si cela est lié à la version PHP du serveur.
itoctopus
127
// 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;
Deepika Patel
la source
16
C'est la réponse la plus directe à la question
Enigma Plus
6
Celui-ci ne nécessite pas d'ignorer le corps et ne fait qu'un seul appel, ce qui en fait également ma réponse préférée.
Mike_K
24
$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"];
ntson1009
la source
1
vous avez fait un type, il devrait être echo $ info ["http_code"]; au lieu de echo $ info ["http_code];
Ludo - Off the record
16

Essayez la fonction " get_headers " de PHP .

Quelque chose du genre:

<?php
    $url = 'http://www.example.com';
    print_r(get_headers($url));
    print_r(get_headers($url, 1));
?>
Raphaël Caixeta
la source
Obtenir les en-têtes est lent par rapport à curl.
Mike Kormendy
4

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);
Développeur principal
la source
2

curl_execest nécessaire. Essayez CURLOPT_NOBODYde ne pas télécharger le corps. Cela pourrait être plus rapide.

Pilules d'explosion
la source
0

function getStatusCode()
{
    $url = 'example.com/test';
    $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);

    return  $httpcode;
}
print_r(getStatusCode());
mouhcine
la source
0

utilisez cette méthode hitCurl pour récupérer tous les types de réponse api, c'est-à-dire Get / Post

        function hitCurl($url,$param = [],$type = 'POST'){
        $ch = curl_init();
        if(strtoupper($type) == 'GET'){
            $param = http_build_query((array)$param);
            $url = "{$url}?{$param}";
        }else{
            curl_setopt_array($ch,[
                CURLOPT_POST => (strtoupper($type) == 'POST'),
                CURLOPT_POSTFIELDS => (array)$param,
            ]);
        }
        curl_setopt_array($ch,[
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
        ]);
        $resp = curl_exec($ch);
        $statusCode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
        curl_close($ch);
        return [
            'statusCode' => $statusCode,
            'resp' => $resp
        ];
    }

Fonction de démonstration pour tester l'API

 function fetchApiData(){
        $url = 'https://postman-echo.com/get';
        $resp = $this->hitCurl($url,[
            'foo1'=>'bar1',
            'foo2'=>'bar2'
        ],'get');
        $apiData = "Getting header code {$resp['statusCode']}";
        if($resp['statusCode'] == 200){
            $apiData = json_decode($resp['resp']);
        }
        echo "<pre>";
        print_r ($apiData);
        echo "</pre>";
    }
Shamim
la source
-3

Voici ma solution besoin d'obtenir Status Http pour vérifier régulièrement l'état du serveur

$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);
}
christian Nguyen
la source
1
Getheaders est lent par rapport à curl.
Mike Kormendy
1
pourquoi n'utilisez-vous pas cron ou webhook au lieu d'utiliser sleep et endless loop?
Ugur Kazdal