web-dev-qa-db-fra.com

curl_exec () retourne toujours faux

J'ai écrit ce morceau de code simple:

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

Dans mon cas $website_content vient comme false. Quelqu'un peut-il suggérer/conseiller quelque chose qui pourrait aller de travers?

92
Adithya

La vérification et la gestion des erreurs sont les amis du programmeur. Vérifiez les valeurs de retour des fonctions d'initialisation et d'exécution de cURL. curl_error() et curl_errno() contiendra des informations supplémentaires en cas d'échec:

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

}

* La curl_init()manuel indique:

Retourne un descripteur de type cURL en cas de succès, [~ # ~] false [~ # ~] en cas d'erreur.

J'ai observé la fonction renvoyer FALSE lorsque vous utilisez son paramètre $url Et le domaine n'a pas pu être résolu. Si le paramètre n'est pas utilisé, la fonction might ne renvoie jamais FALSE. Toujours vérifier quand même, cependant, puisque le manuel n’indique pas clairement quelles sont les "erreurs".

213
Linus Kleen

Cela m’est arrivé hier et c’est parce que je suivais un PDF manuel pour développer un module permettant de communiquer avec une API et en copiant le lien directement à partir du manuel, pour une raison étrange, le hyphen du lien copié était dans un codage différent et par conséquent, la curl_exec() renvoyait toujours false car il lui était impossible de communiquer avec le serveur.

Il me fallut quelques heures pour comprendre enfin la différence entre les personnages ci-dessous:

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

Chaque fois que j'essayais d'accéder au lien directement à partir d'un navigateur, il était converti en quelque chose comme https://www.xn--eexample-0m3d.com/api.

Il peut vous sembler qu’ils sont égaux, mais si vous vérifiez l’encodage de hyphensici vous verrez que le premier hyphen est un caractère Unicode - + 201 et l'autre est un + 002D .

J'espère que ça aide quelqu'un.

2
CIRCLE

Dans mon cas, je dois définir VERIFYHOST et VERIFYPEER sur false, comme ceci:

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

avant l'appel à curl_exec($ch).

Parce que je travaille entre deux environnements de développement avec des certificats auto-assignés. Avec des certificats valides, il n'est pas nécessaire de définir VERIFYHOST et VERIFYPEER sur false car la méthode curl_exec($ch) fonctionnera et renverra la réponse attendue.

0
DanielaG