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

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);
cráneo vacío
fuente
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.

Hereblur
fuente
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);
}
Daniel
fuente
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().

CodeCaster
fuente
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.

Gondy
fuente
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.

psynnott
fuente
1

Prueba esto:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
Meldo
fuente
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

Alejandro Hdez. Ángeles
fuente