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?

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;

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;

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"];

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));
?>

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);

2

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


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());

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>";
    }

-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);
}

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.