curl_exec () siempre devuelve falso

113

He escrito este sencillo 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_contentviene como false. ¿Alguien puede sugerir / aconsejar algo sobre lo que podría estar saliendo mal?

Adithya
fuente
8
Consulte curl_error()los detalles del error y publíquelos aquí, por favor.
Linus Kleen
@LinusKleen Si publica el curl_error () como respuesta, lo votaré, ya que me permitió ver cuál era mi problema.
Giles Roberts
¿Cuál fue exactamente el problema? ¿Qué error curl_error()reveló?
showdev

Respuestas:

241

La comprobación y el manejo de errores son amigos del programador. Compruebe los valores de retorno de las funciones cURL de inicialización y ejecución. curl_error()y curl_errno()contendrá más información en caso de avería:

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

}

* El curl_init() manual dice:

Devuelve un identificador cURL en caso de éxito, FALSO en errores.

He observado que la función regresa FALSEcuando está usando su $urlparámetro y el dominio no se pudo resolver. Si el parámetro no se utiliza, la función podría no volver nunca FALSE. Sin embargo, compruébelo siempre de todos modos, ya que el manual no indica claramente qué son los "errores" en realidad.

Linus Kleen
fuente
9
+1: Solución de problemas simple y directa para curl en PHP en curl_execFALSE return. - Modo Curl Verbose en PHP ejemplo
hakre
Si. De hecho, había descubierto esto hace mucho tiempo. Sin embargo, gracias por la respuesta :)
Adithya
7
No hay problema. Obtuve una insignia de Revival :-) Gracias por aceptar.
Linus Kleen
@marverix bueno, su nombre es Linus: P
Nino Škopac
y no te olvides de curl_close ($ ch);
Rafik Bari
10

En mi caso necesito conjunto VERIFYHOSTy VERIFYPEERque false, de esta manera:

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

antes de la llamada a curl_exec($ch).

Porque estoy trabajando entre dos entornos de desarrollo con certificados autoasignados. Con certificados válidos, no es necesario configurar VERIFYHOSTy VERIFYPEERhacerlo falseporque el curl_exec($ch)método funcionará y devolverá la respuesta que espera.

DanielaG
fuente
Esto fue realmente útil para mí. ¡Gracias por el consejo!
n8jadams
3

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 desde el manual, por alguna extraña razón, el hyphenenlace del copiado estaba en una forma diferente codificación y, por lo tanto, curl_exec()siempre regresaba falseporque no podía comunicarse con el servidor.

Me tomó un par de horas entender finalmente la diferencia en los caracteres a continuación:

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

Cada vez que intenté acceder al enlace directamente desde un navegador, se convirtió en algo como https://www.xn--eexample-0m3d.com/api.

Puede que te parezca que son iguales pero si revisas la codificación de hyphens aquí verás que el primero hyphenes un carácter Unicode U + 2010 y el otro es un U + 002D .

Espero que esto ayude a alguien.

CIRCULO
fuente