PHP cURL CÓDIGO HTTP devuelve 0


95

No entiendo cuando hago eco de $ httpCode siempre obtengo 0, esperaba 404 cuando cambio $ html_brand a una URL rota. ¿Hay algo que me pierda o que no sepa? Gracias.

 //check if url exist
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $html_brand);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if ($httpCode == 404) {
    echo "The Web Page Cannot Be Found";
    return;
}
curl_close($ch);

Respuestas:


95

Si se conecta con el servidor, puede obtener un código de retorno, de lo contrario fallará y obtendrá un 0. Por lo tanto, si intenta conectarse a "www.google.com/lksdfk", obtendrá un código de retorno de 400, si va directamente a google.com, obtendrá 302 (y luego 200 si reenvía a la página siguiente ... bueno, lo hago porque reenvía a google.com.br, por lo que es posible que no obtenga eso), y si va a "googlecom" obtendrá un 0 (host no encontrado), por lo que con el último, no hay nadie para devolver un código.

Probado usando el siguiente código.

<?php

$html_brand = "www.google.com";
$ch = curl_init();

$options = array(
    CURLOPT_URL            => $html_brand,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER         => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_ENCODING       => "",
    CURLOPT_AUTOREFERER    => true,
    CURLOPT_CONNECTTIMEOUT => 120,
    CURLOPT_TIMEOUT        => 120,
    CURLOPT_MAXREDIRS      => 10,
);
curl_setopt_array( $ch, $options );
$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if ( $httpCode != 200 ){
    echo "Return code is {$httpCode} \n"
        .curl_error($ch);
} else {
    echo "<pre>".htmlspecialchars($response)."</pre>";
}

curl_close($ch);

1
También gracias por volver a ubicar la ubicación de seguimiento, a veces obtengo 301, que es un problema de redirección.
Ardeus

Es extraño a pesar de que $ response tiene contenido html, pero el $ httpcode siempre devuelve 0, más curl_error es nulo. lo que pudo salir mal. Solo incluyo returnntransfer, header (false), followlocation solo en la configuración.
Ardeus

Solo para agregar, si hay espacios en blanco antes o después de la URL, también arrojará http_code = 0
Raja Amer Khan


80

Pruebe esto después de curl_exec para ver cuál es el problema:

print curl_error($ch);

Si imprime algo como 'mal formado', verifique el formato de su URL.


5
Gracias por esa sugerencia, me salvó el trasero :)
wbj

¡SI! Salvó mi trasero.
pimbrouwers

5

compruebe curl_error después de curl_getinfo para averiguar los errores ocultos.

if(curl_errno($ch)){   
    echo 'Curl error: ' . curl_error($ch);
}

2

Como se dice aquí y a continuación, una solicitud fallida ( es decir, no se encuentra el servidor ) devuelve falso, sin código de estado HTTP, ya que nunca se ha recibido una respuesta.

Llame curl_error().


2

Tuve el mismo problema y en mi caso esto se debió a que la función curl_exec está deshabilitada en php.ini. Verifique los registros:

PHP Warning:  curl_exec() has been disabled for security reasons in /var/www/***/html/test.php on line 18

La solución es eliminar curl_exec de las funciones deshabilitadas en php.ini en el archivo de configuración del servidor.


1

¿Cuál es el contenido exacto que está pasando a $ html_brand?

Si tiene una sintaxis de URL no válida, es muy probable que obtenga el código HTTP 0.


1

Prueba esto:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

2
Al responder una pregunta anterior con una respuesta aceptada, es importante señalar qué aspecto nuevo de la pregunta aborda su respuesta. Además, las respuestas de solo código generalmente se pueden mejorar agregando alguna explicación de cómo y por qué funcionan. Además, al sugerir que alguien desactive la seguridad, es MUY importante explicar por qué y cuáles son los riesgos.
Jason Aller

Si bien este código puede responder a la pregunta, proporcionar un contexto adicional sobre cómo y / o por qué resuelve el problema mejoraría el valor de la respuesta a largo plazo.
Donald Duck

0

Otra razón para que PHP devuelva el código http 0 es el tiempo de espera. En mi caso, tenía la siguiente configuración:

curl_setopt ($ http, CURLOPT_TIMEOUT_MS, 500);

Resultó que la solicitud al punto final al que apuntaba siempre tomaba más de 500 ms, siempre se agotaba y siempre devolvía el código http 0.

Si elimina esta configuración (CURLOPT_TIMEOUT_MS) o coloca un valor más alto (en mi caso 5000), obtendrá el código http real, en mi caso un 200 (como se esperaba).

Ver https://www.php.net/manual/en/function.curl-setopt.php

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.