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?

Aaran McGuire
fuente

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;
MoonLite
fuente
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;
Deepika Patel
fuente
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"];
ntson1009
fuente
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));
?>
Rafael Caixeta
fuente
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);
Desarrollador principal
fuente
2

curl_execes necesario. Intenta CURLOPT_NOBODYno descargar el cuerpo. Eso podría ser más rápido.

Píldoras de explosión
fuente
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
fuente
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>";
    }
Shamim
fuente
-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);
}
Christian Nguyen
fuente
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