Lorsque vous utilisez PHP pour les demandes de réseau, les extensions de boucle sont sans aucun doute l'un des outils les plus courants et les plus puissants. Dans l'utilisation quotidienne de Curl , Curl_setopt () est utilisé pour définir les options de demande, et Curl_close () est utilisée pour fermer la poignée de session. Il semble simple et clair, mais il y a beaucoup de "fosses" cachées lorsqu'elles sont utilisées ensemble. Cet article analysera plusieurs mauvaises façons de les utiliser en profondeur pour vous aider à éviter d'être touché.
$ch = curl_init();
curl_close($ch);
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/data");
Analyse des problèmes : une fois que curl_close () est appelé, la poignée $ ch a été publiée. Tout paramètre ultérieur à ce sujet sera invalide, et même un avertissement peut être lancé.
Solution : assurez-vous que toutes les demandes et les travaux de traitement sont terminés avant d'appeler curl_close () . curl_close () devrait être la dernière étape de l'ensemble de votre processus de demande.
De nombreux développeurs essaieront de réutiliser des poignées pour améliorer les performances, mais si vous continuez accidentellement à l'utiliser après la fermeture, vous obtiendrez une erreur:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/one");
curl_exec($ch);
curl_close($ch);
// Utiliser à nouveau
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/two");
curl_exec($ch);
Analyse des problèmes : $ ch après la fermeture est une ressource non valide. Continuer à l'utiliser amènera PHP à lancer une erreur: la ressource fournie n'est pas une ressource de manche Curl valide .
Pratique suggérée : Si vous souhaitez lancer plusieurs demandes, ne fermez pas la poignée immédiatement après la première demande, ou utilisez plusieurs poignées, ou ne réinitialisez pas chaque fois que vous l'utilisez.
$ch = curl_init("https://gitbox.net/api/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
$result = curl_exec($ch);
curl_close($ch);
echo "Le résultat est:" . $result;
Analyse des problèmes : Curlopt_returntransfer n'est pas défini sur true , ce qui entraîne le résultat directement sur la page, tandis que $ Result est réellement vrai ou faux , pas le contenu de retour réel.
Façon correcte de le faire :
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
De cette façon, le contenu retourné peut être obtenu pour le traitement ultérieur, tel que le décodage JSON, l'analyse des chaînes, etc.
Beaucoup de gens ignorent les erreurs de vérification avant de fermer:
$ch = curl_init("https://gitbox.net/api/info");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
if (!$data) {
echo "Échec de la demande";
}
Analyse des problèmes : curl_exec () Renvoie False pour indiquer l'échec, mais plus important encore, Curl_error ($ ch) fournit des informations d'erreur détaillées. Une fois Curl_close () exécuté, la description d'erreur ne peut plus être obtenue.
Pratiques suggérées :
$data = curl_exec($ch);
if (curl_errno($ch)) {
echo 'cURL erreur:' . curl_error($ch);
}
curl_close($ch);
Jugez d'abord l'erreur, puis fermez la poignée. C'est une bonne habitude d'encodage.
$ch = curl_init("https://gitbox.net/secure/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
Analyse des problèmes : si la cible est HTTPS et Curlopt_SSL_VERIFYPEER n'est pas définie, elle peut échouer dans certains environnements.
Pratiques suggérées :
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // ou false(Pour le test uniquement)
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
Vous devez définir l'environnement de déploiement réel et permettre la vérification autant que possible dans l'environnement de production.