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?
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".
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 hyphens
ici 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.
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.