Obtener código HTTP en PHP usando curl


177

Estoy usando CURL para obtener el estado de un sitio, si está arriba / abajo o redirigiendo a otro sitio. Quiero hacerlo lo más ágil posible, pero no funciona 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;
?>

Tengo esto envuelto en una función. Funciona bien, pero el rendimiento no es el mejor porque descarga toda la página, pero si la elimino $output = curl_exec($ch);vuelve 0todo el tiempo.

¿Alguien sabe cómo mejorar el rendimiento?

Respuestas:


261

Primero asegúrese de que si la URL es realmente válida (una cadena, no vacía, buena sintaxis), esto es rápido para verificar el lado del servidor. Por ejemplo, hacer esto primero podría ahorrarle mucho tiempo:

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

Asegúrate de buscar solo los encabezados, no el contenido del cuerpo:

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

Para obtener más detalles sobre cómo obtener el código http del estado de la URL, me remito a otra publicación que hice (también ayuda con las siguientes redirecciones):


Como un todo:

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

44
Edité su publicación y pegué el código de ejemplo de trabajo en su conjunto. Lo encuentro de esta manera más útil. ¡Por cierto, +1 por mencionar las configuraciones CURLOPT_HEADER y CURLOPT_NOBODY! :)
Sk8erPeter

25
No es necesario establecer CURLOPT_HEADER en verdadero. Todavía obtienes el código http de curl_getinfo () de cualquier manera.
Brainware

77
A partir de PHP 5.5.0 y cURL 7.10.8, este [CURLINFO_HTTP_CODE] es un alias heredado de CURLINFO_RESPONSE_CODE ( ref )
muestra el

Por alguna razón, esta línea curl_setopt($ch, CURLOPT_NOBODY, true);está colgando. No estoy seguro si esto está relacionado con la versión PHP del servidor.
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
Esta es la respuesta más directa a la pregunta
Enigma Plus

66
Este no requiere ignorar el cuerpo y solo hace una llamada, por lo que también es mi respuesta preferida.
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
usted hizo un tipo, debería ser echo $ info ["http_code"]; en lugar de echo $ info ["http_code];
Ludo - Off the record

16

Prueba la función " get_headers " de PHP .

Algo en la línea de:

<?php
    $url = 'http://www.example.com';
    print_r(get_headers($url));
    print_r(get_headers($url, 1));
?>

Obtener encabezados es lento en comparación con el rizo.
Mike Kormendy

4

curl_getinfo - Obtenga información sobre una transferencia específica

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


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

use este método hitCurl para obtener todo tipo de respuesta de API, es decir, 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
        ];
    }

Función de demostración para probar la 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

Aquí está mi solución necesita obtener Status Http para verificar el estado del servidor regularmente

$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 es lento en comparación con el rizo.
Mike Kormendy

1
¿Por qué no usas cron o webhook en lugar de usar sleep y bucle sin fin?
Ugur Kazdal
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.