curl_exec () renvoie toujours faux

114

J'ai écrit ce simple morceau de code:

$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_contentvient comme false. Quelqu'un peut-il suggérer / conseiller quelque chose qui pourrait mal tourner?

Adithya
la source
8
Consultez curl_error()les détails des erreurs et publiez-les ici, s'il vous plaît.
Linus Kleen
@LinusKleen Si vous postez le curl_error () comme réponse, je vais le voter car cela m'a permis de voir quel était mon problème.
Giles Roberts
Quel était exactement le problème? Quelle erreur a curl_error()révélé?
showdev

Réponses:

242

La vérification et la gestion des erreurs sont l'ami du programmeur. Vérifiez les valeurs de retour des fonctions cURL d'initialisation et d'exécution. curl_error()et curl_errno()contiendra de plus amples informations en cas de panne:

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

}

* Le curl_init() manuel indique:

Renvoie un handle cURL en cas de succès, FALSE en cas d'erreurs.

J'ai observé la fonction à renvoyer FALSElorsque vous utilisez son $urlparamètre et que le domaine n'a pas pu être résolu. Si le paramètre n'est pas utilisé, la fonction peut ne jamais revenir FALSE. Vérifiez-le toujours de toute façon, car le manuel ne précise pas clairement ce que sont réellement les «erreurs».

Linus Kleen
la source
9
+1: Dépannage simple et direct pour curl en PHP au curl_execretour FALSE. - Curl Verbose Mode dans l'exemple PHP
hakre
Ouais. Avait en fait compris cela il y a longtemps. Merci pour la réponse :)
Adithya
7
Aucun problème. Vous avez un badge Revival pour cela :-) Merci d'avoir accepté.
Linus Kleen
@marverix bien, son nom est Linus: P
Nino Škopac
et n'oubliez pas curl_close ($ ch);
Rafik Bari
10

Dans mon cas, je dois définir VERIFYHOSTet VERIFYPEERà 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-attribués. Avec des certificats valides, il n'est pas nécessaire de définir VERIFYHOSTet VERIFYPEERà falsecar la curl_exec($ch)méthode fonctionnera et retournera la réponse que vous attendez.

DanielaG
la source
Cela m'a vraiment été utile. Merci pour le conseil!
n8jadams le
3

Cela m'est arrivé hier et dans mon cas, c'était parce que je suivais un manuel PDF pour développer un module pour communiquer avec une API et tout en copiant le lien directement à partir du manuel, pour une raison étrange, le hyphenlien copié était dans un autre encodage et donc le curl_exec()retournait toujours falsecar il était incapable de communiquer avec le serveur.

Il m'a fallu quelques heures pour enfin comprendre 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 se convertissait 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 du hyphens ici vous verrez que le premier hyphenest un caractère unicode U + 2010 et l'autre est un U + 002D .

J'espère que cela aide quelqu'un.

CERCLE
la source