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?

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;

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;

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

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

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

2

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


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

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

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

1
Getheaders ist im Vergleich zu Curl langsam.
Mike Kormendy

1
Warum benutzt du nicht Cron oder Webhook anstatt Schlaf und Endlosschleife?
Ugur Kazdal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.