Abrufen von HTTP-Code in PHP mithilfe von Curl

177

Ich verwende CURL, um den Status einer Site abzurufen, wenn diese auf / ab geht oder auf eine andere Site umgeleitet wird. Ich möchte es so rational wie möglich gestalten, aber es funktioniert nicht gut.

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

Ich habe dies in eine Funktion eingewickelt. Es funktioniert gut, aber die Leistung ist nicht die beste, da es die gesamte Seite herunterlädt$output = curl_exec($ch); sie immer wieder zurückgegeben 0.

Weiß jemand, wie man die Leistung verbessert?

Aaran McGuire
quelle

Antworten:

261

Stellen Sie zunächst sicher, dass die URL tatsächlich gültig ist (eine Zeichenfolge, nicht leer, gute Syntax), um die Serverseite schnell zu überprüfen. Wenn Sie dies zuerst tun, können Sie beispielsweise viel Zeit sparen:

if(!$url || !is_string($url) || ! preg_match('/^http(s)?:\/\/[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(\/.*)?$/i', $url)){
    return false;
}

Stellen Sie sicher, dass Sie nur die Header abrufen, nicht den Textinhalt:

@curl_setopt($ch, CURLOPT_HEADER  , true);  // we want headers
@curl_setopt($ch, CURLOPT_NOBODY  , true);  // we don't need body

Weitere Informationen zum Abrufen des URL-Status-http-Codes finden Sie in einem anderen Beitrag, den ich erstellt habe (dies hilft auch bei folgenden Weiterleitungen):


Als Ganzes:

$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
quelle
4
Ich habe Ihren Beitrag bearbeitet und den Arbeitsbeispielcode als Ganzes eingefügt. Ich finde es so hilfreicher. Übrigens +1 für die Erwähnung der Einstellungen CURLOPT_HEADER und CURLOPT_NOBODY! :)
Sk8erPeter
25
Es ist nicht erforderlich, CURLOPT_HEADER auf true zu setzen. Sie erhalten den httpcode immer noch von curl_getinfo ().
Brainware
7
Ab PHP 5.5.0 und cURL 7.10.8 ist dieser [CURLINFO_HTTP_CODE] ein Legacy-Alias ​​von CURLINFO_RESPONSE_CODE ( ref )
sshow
Aus irgendeinem Grund curl_setopt($ch, CURLOPT_NOBODY, true);hängt diese Linie . Ich bin mir nicht sicher, ob dies mit der PHP-Version des Servers zusammenhängt.
Itoctopus
126
// 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
quelle
16
Dies ist die direkteste Antwort auf die Frage
Enigma Plus
6
Dieser erfordert nicht, den Körper zu ignorieren und macht nur einen Anruf, was ihn auch zu meiner bevorzugten Antwort macht.
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
quelle
1
Wenn Sie einen Typ erstellt haben, sollte er echo $ info ["http_code"] sein. anstelle von echo $ info ["http_code];
Ludo - Off the record
16

Probieren Sie die PHP- Funktion " get_headers " aus.

Etwas in der Art von:

<?php
    $url = 'http://www.example.com';
    print_r(get_headers($url));
    print_r(get_headers($url, 1));
?>
Raphael Caixeta
quelle
Das Abrufen von Headern ist im Vergleich zu Curl langsam.
Mike Kormendy
4

curl_getinfo - Informationen zu einer bestimmten Übertragung erhalten

Überprüfen Sie 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);
Leitender Entwickler
quelle
2

curl_execist notwendig. Versuchen Sie CURLOPT_NOBODY, den Körper nicht herunterzuladen. Das könnte schneller sein.

Explosionspillen
quelle
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
quelle
0

Verwenden Sie diese hitCurl- Methode, um alle Arten von API-Antworten abzurufen , z. B. 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
        ];
    }

Demofunktion zum Testen der 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
quelle
-3

Hier ist meine Lösung, um Status Http zu erhalten, um den Status des Servers regelmäßig zu überprüfen

$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
quelle
1
Getheaders ist im Vergleich zu Curl langsam.
Mike Kormendy
1
Warum benutzt du nicht Cron oder Webhook anstatt Schlaf und Endlosschleife?
Ugur Kazdal