Les fonctions Curl_Multi_ * Série sont très courantes lors de l'utilisation de l'extension Curl de PHP pour les demandes simultanées. curl_multi_close () est une fonction utilisée pour libérer des ressources et fermer la collection de poignées Curl. Cependant, de nombreux développeurs peuvent être perplexes lorsqu'ils traitent de réponses, y compris des redirections (comme 301, 302): et,
Cet article vous apprendra à utiliser CURL_MULTI_CLOSE () correctement dans un principe et un point de vue pratique pour éviter de perdre des réponses de redirection importantes lors de la fermeture d'une demande.
Tout d'abord, vous devez comprendre que les principales fonctions de curl_multi_close ($ multi_handle) sont:
Fermer un multi-gestionnaire
Libérez toutes les ressources associées en même temps
Conseils importants :
curl_multi_close () n'est responsable que du nettoyage des ressources et ne gérera pas automatiquement les redirections .
Le traitement des redirectes doit être terminé pendant la phase d'exécution de la demande (tels que la définition des options avant Curl_Multi_Exec () ).
Après la fermeture, vous ne pouvez plus obtenir de données de réponse à la demande, y compris les informations de redirection.
Par conséquent, avant d'appeler curl_multi_close () , vous devez vous assurer que toutes les demandes ont été entièrement exécutées et que la réponse requise a été lue.
Pour que Curl suive correctement la redirection et obtenez la réponse finale avant de fermer, vous devez le faire:
Définissez les options Curl pour permettre des redirections de suivi automatique.
Exécutez complètement la demande et récupérez toutes les données requises.
Enfin, Curl_Multi_Close () est appelé pour libérer la ressource.
<?php
// Créer un processeur à main multiples
$multiHandle = curl_multi_init();
// Initialiser un séparé cURL Session
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://gitbox.net/redirect-example');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // Autoriser les redirections de suivi automatique
curl_setopt($ch, CURLOPT_MAXREDIRS, 5); // Suivre le plus5Redirection
// 将Session添加到多句柄处理器
curl_multi_add_handle($multiHandle, $ch);
// Exécuter une demande
$running = null;
do {
$status = curl_multi_exec($multiHandle, $running);
if ($status > 0) {
echo "cURL Error: " . curl_multi_strerror($status);
}
// En attente d'une connexion active
curl_multi_select($multiHandle);
} while ($running > 0);
// Obtenez du contenu et des informations avant la fermeture
$response = curl_multi_getcontent($ch);
$info = curl_getinfo($ch);
// Imprimer le contenu de la réponse
echo "Final URL: " . $info['url'] . PHP_EOL;
echo "HTTP Code: " . $info['http_code'] . PHP_EOL;
echo "Response Body: " . $response . PHP_EOL;
// Nettoyage
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
curl_multi_close($multiHandle);
?>
CURLOPT_FOLLOWLOCATION est défini sur TRUE pour gérer automatiquement les redirections.
Après que Curl_Multi_Exec est entièrement exécuté, utilisez Curl_Multi_getContent () et Curl_getInfo () pour obtenir les informations de réponse finales.
Curl_multi_close () ne peut être appelé qu'après avoir complètement récupéré les données.
Si vous ne gérez pas ces étapes correctement avant Curl_Multi_close () , vous ne pourrez pas obtenir les données de réponse finale redirigées.
Voici une façon sujette à l'erreur de l'écrire:
<?php
$multiHandle = curl_multi_init();
$ch = curl_init('https://gitbox.net/redirect-example');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
// erreur:Fermez-le directement si l'exécution n'est pas terminée
curl_multi_close($multiHandle);
$response = curl_multi_getcontent($ch); // Le contenu obtenu pour le moment peut être vide ou non défini
?>
Analyse des problèmes :
La poignée multiple est fermée avant la fin de la demande, entraînant l'incapacité ultérieure d'obtenir correctement la réponse et les données de redirection.
curl_multi_close () ne gère aucune redirection , elle n'est responsable que du nettoyage des ressources.
La redirection doit être définie en définissant Curlopt_Follocation et le traitement de la demande est terminé avant la fermeture.
Assurez-vous d'extraire toutes les données requises avant curl_multi_close () .
Dans l'ordre correct (exécuter → Obtenez du contenu → Supprimer la poignée → Fermer Multi) pour vous assurer que la demande est terminée et que les données ne sont pas perdues.
La maîtrise de ces détails peut vous rendre facile à gérer des demandes simultanées complexes, surtout en ce qui concerne la redirection des réponses!