Pregunta curl_exec () siempre devuelve falso


He escrito esta simple pieza de código:

$ch = curl_init();

//Set options
curl_setopt($ch, CURLOPT_URL, "http://www.php.net");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$website_content = curl_exec ($ch);

En mi caso $website_content viene como false. ¿Alguien puede sugerir / aconsejar algo que podría estar yendo mal?


74
2017-11-22 13:51


origen


Respuestas:


La comprobación y el manejo de errores es el amigo del programador. Verifique los valores de retorno de las funciones de inicialización y ejecución de cURL. curl_error() y curl_errno() contendrá más información en caso de falla:

try {
    $ch = curl_init();

    // Check if initialization had gone wrong*    
    if ($ch === false) {
        throw new Exception('failed to initialize');
    }

    curl_setopt($ch, CURLOPT_URL, 'http://example.com/');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt(/* ... */);

    $content = curl_exec($ch);

    // Check the return value of curl_exec(), too
    if ($content === false) {
        throw new Exception(curl_error($ch), curl_errno($ch));
    }

    /* Process $content here */

    // Close curl handle
    curl_close($ch);
} catch(Exception $e) {

    trigger_error(sprintf(
        'Curl failed with error #%d: %s',
        $e->getCode(), $e->getMessage()),
        E_USER_ERROR);

}

* los curl_init()  manual estados:

Devuelve un controlador cURL en caso de éxito, FALSO en errores

He observado la función para regresar FALSE cuando estás usando $url parámetro y el dominio no se pudo resolver. Si el parámetro no se usa, la función podría Nunca volver FALSE. Siempre revise de todos modos, sin embargo, ya que el manual no indica claramente qué "errores" realmente son.


176
2017-11-09 15:44



Esto me pasó ayer y en mi caso fue porque estaba siguiendo un manual en PDF para desarrollar algún módulo para comunicarme con una API y mientras copiaba el enlace directamente del manual, por alguna extraña razón, el hyphen desde el enlace copiado estaba en una codificación diferente y, por tanto, el curl_exec() siempre regresaba false porque no pudo comunicarse con el servidor.

Me llevó un par de horas entender finalmente la diferencia en los siguientes caracteres:

https://www.e‐example.com/api
https://www.e-example.com/api

Cada vez que traté de acceder al enlace directamente desde un navegador, se convirtió a algo así comohttps://www.xn--eexample-0m3d.com/api.

Puede parecerle que son iguales, pero si verifica la codificación del hyphens  aquí verás que el primero hyphen es un caracter unicode U + 2010 y el otro es un U + 002D.

Espero que esto ayude a alguien.


0
2017-11-12 00:29