Position actuelle: Accueil> Derniers articles> curl_multi_close comment gérer les réponses redirigées lors de la fermeture d'une demande

curl_multi_close comment gérer les réponses redirigées lors de la fermeture d'une demande

gitbox 2025-05-12

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.

Comprendre le rôle de base de Curl_Multi_Close

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.

Gérer correctement les réponses de redirection

Pour que Curl suive correctement la redirection et obtenez la réponse finale avant de fermer, vous devez le faire:

  1. Définissez les options Curl pour permettre des redirections de suivi automatique.

  2. Exécutez complètement la demande et récupérez toutes les données requises.

  3. Enfin, Curl_Multi_Close () est appelé pour libérer la ressource.

Exemple de code

 <?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&#39;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);
?>

Interprétation clé

  • 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.

Exemples d'erreur courants

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&#39;exécution n&#39;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.

résumé

  • 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!