153 votes

curl_exec() renvoie toujours false

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_content vient en tant que false . Quelqu'un peut-il me suggérer ou me conseiller sur ce qui pourrait ne pas fonctionner ?

12 votes

Consultez curl_error() pour les détails de l'erreur et les poster ici, s'il vous plaît.

0 votes

@LinusKleen Si vous postez le curl_error() comme réponse, je l'upvote car il m'a permis de voir quel était mon problème.

0 votes

Quel était exactement le problème ? Quelle erreur a curl_error() révéler ?

306voto

Linus Kleen Points 15925

Le contrôle et la gestion des erreurs sont les amis du programmeur. Vérifiez les valeurs de retour des fonctions cURL d'initialisation et d'exécution. curl_error() y 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');
    }

    // Better to explicitly set URL
    curl_setopt($ch, CURLOPT_URL, 'http://example.com/');
    // That needs to be set; content will spill to STDOUT otherwise
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    // Set more options
    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));
    }

    // Check HTTP return code, too; might be something else than 200
    $httpReturnCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    /* Process $content here */

} catch(Exception $e) {

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

} finally {
    // Close curl handle unless it failed to initialize
    if (is_resource($ch)) {
        curl_close($ch);
    }
}

* Le site curl_init() manuel États :

Renvoie un identifiant cURL en cas de succès, FAUX sur les erreurs.

J'ai observé que la fonction renvoie FALSE lorsque vous utilisez son $url et le domaine n'a pas pu être résolu. Si le paramètre n'est pas utilisé, la fonction pourrait ne reviennent jamais FALSE . Vérifiez-le quand même toujours, car le manuel n'indique pas clairement ce que sont les "erreurs".

46voto

DanielaG Points 191

Dans mon cas, je dois définir VERIFYHOST y 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 VERIFYHOST y VERIFYPEER à false parce que le curl_exec($ch) fonctionnera et renverra la réponse que vous attendez.

1 votes

C'était en fait utile pour moi. Merci pour le conseil !

1 votes

C'était la solution à mon problème. Félicitations à

3voto

CIRCLE Points 407

Cela m'est arrivé hier et, dans mon cas, c'est parce que je suivais un manuel PDF pour développer un module de communication avec une API et, alors que je copiais le lien directement depuis le manuel, pour une raison étrange, la page d'accueil de l'API a été modifiée. hyphen à partir du lien copié était dans un encodage différent et donc la curl_exec() revenait toujours false parce qu'il n'a pas pu communiquer avec le serveur.

Il m'a fallu quelques heures pour enfin comprendre la différence entre les personnages ci-dessous :

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

Chaque fois que j'ai essayé d'accéder au lien directement à partir d'un navigateur, il s'est 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 l'adresse de l'utilisateur hyphens aquí vous verrez que le premier hyphen est un caractère unicode U+2010 et l'autre est un U+002D .

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X