Position actuelle: Accueil> Derniers articles> Analyse d'erreur commune de la fonction curl_multi_close dans les demandes simultanées

Analyse d'erreur commune de la fonction curl_multi_close dans les demandes simultanées

gitbox 2025-05-12

Lorsque vous utilisez la bibliothèque de fonction Curl_Multi_ * pour les demandes simultanées dans PHP, Curl_Multi_Close est une fonction très critique qui ferme plusieurs ressources de session Curl. Cependant, lorsque vous l'utilisez, les développeurs sont enclins à rencontrer des pièges, en particulier lors de la gestion d'un grand nombre de demandes simultanées. Cet article analysera les erreurs courantes de Curl_Multi_Close en profondeur et fournira des solutions correspondantes.

1. Appelez Curl_Multi_Close avant que Curl_Multi_Exec ne soit correctement exécuté

Lorsque vous utilisez plusieurs demandes simultanées à l'aide de Curl, Curl_Multi_Close doit être appelée une fois que toutes les demandes ont été exécutées. Si toutes les demandes ne sont pas traitées correctement lorsque CURL_MULTI_EXEC est appelée, ou que la session est fermée sans s'exécuter entièrement, cela peut entraîner des erreurs ou une fuite de ressources.

Erreurs courantes:

 $mh = curl_multi_init();
$ch1 = curl_init('https://gitbox.net/api/data1');
$ch2 = curl_init('https://gitbox.net/api/data2');
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// Démonstration d'erreur:Appeler à l'avance curl_multi_close
curl_multi_close($mh); // La demande n'a pas encore été terminée

Solution:
Assurez-vous d'appeler Curl_Multi_Close une fois toutes les demandes terminées. La bonne façon consiste à utiliser Curl_Multi_EXEC pour surveiller et attendre que la demande se termine.

 $mh = curl_multi_init();
$ch1 = curl_init('https://gitbox.net/api/data1');
$ch2 = curl_init('https://gitbox.net/api/data2');
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM || $active);

curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh); // Appeler correctement

2. J'ai oublié de nettoyer chaque poignée de boucle

Chaque poignée de demande de boucle doit être explicitement supprimée une fois la demande terminée. Si vous oubliez de supprimer la poignée après avoir terminé la demande, cela peut provoquer une fuite de ressources et affecter les performances et la stabilité du programme.

Erreurs courantes:

 curl_multi_add_handle($mh, $ch1);
// Fermé directement sans retirer la poignée multi handle
curl_multi_close($mh); // Peut provoquer une fuite de ressources

Solution:
Avant d'appeler CURL_MULTI_CLOSE , assurez-vous de supprimer chaque poignée de boucle.

 curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh); // Libérer les ressources

3. Vérifiez si la demande de curl réussit

Parfois, certaines demandes échouent lors de l'exécution de demandes simultanées, ce qui fait que certaines poignées restent un état incomplet avant d'appeler Curl_Multi_Close . Pour éviter ce type de problème, assurez-vous de vérifier l'état d'exécution de chaque demande.

Erreurs courantes:

 $ch1 = curl_init('https://gitbox.net/api/data1');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
$response1 = curl_exec($ch1); // Si la demande échoue,curl_exec retour false
if ($response1 === false) {
    echo 'Error: ' . curl_error($ch1);
}
curl_multi_close($mh); // Fermer tôt en cas d'erreur

Solution:
Assurez-vous que chaque demande est exécutée avec succès avant de nettoyer pour éviter de fermer la connexion à l'avance lorsque la demande échoue.

 $response1 = curl_exec($ch1);
if ($response1 === false) {
    echo 'Error: ' . curl_error($ch1);
} else {
    curl_multi_remove_handle($mh, $ch1);
}
curl_multi_close($mh); // Assurez-vous de fermer uniquement une fois toutes les demandes terminées

4. Format URL incorrect ou demande de délai d'expiration

Dans les demandes simultanées, plusieurs demandes sont émises en même temps. Si l'URL de l'une des demandes est incorrecte ou que la demande a expiré, CURL_MULTI_EXEC peut ne pas être en mesure de remplir toutes les demandes normalement, ce qui affectera l'exécution de Curl_Multi_Close .

Erreurs courantes:

 $ch = curl_init('https://gitbox.net/api/invalid_url'); // Faux URL
curl_multi_add_handle($mh, $ch);
curl_multi_exec($mh, $active);
curl_multi_close($mh); // La demande ne peut pas encore être terminée

Solution:
Assurez-vous que l'URL est correcte et définissez un délai d'expiration raisonnable. Le délai de délai de demande peut être défini via curlopt_timeout .

 curl_setopt($ch1, CURLOPT_URL, 'https://gitbox.net/api/data1');
curl_setopt($ch1, CURLOPT_TIMEOUT, 30); // Définissez le temps mort sur 30 Deuxième

5. Appelez Curl_Multi_Close plusieurs fois

CURL_MULTI_CLOSE ne doit être appelé qu'une seule fois à la fin du cycle de vie de chaque multi-mains. Plusieurs appels à la fonction peuvent entraîner des erreurs inutiles ou des échecs de version de ressources.

Erreurs courantes:

 curl_multi_close($mh); // Appels multiples
curl_multi_close($mh); // Le deuxième appel

Solution:
Assurez-vous que CURL_MULTI_CLOSE est appelé une seule fois et exécuté une fois toutes les demandes terminées et toutes les poignées ont été supprimées correctement.

 curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh); // Appelé une seule fois

Résumer

CURL_MULTI_CLOSE est une fonction importante dans les demandes simultanées, mais vous devez faire attention à la gestion des commandes et des ressources lorsque vous l'utilisez. Avant d'appeler CURL_MULTI_CLOSE , assurez-vous que toutes les demandes ont été exécutées avec succès et que la poignée est supprimée pour éviter les exceptions de fuite de ressources ou de demande. Dans le même temps, grâce à une gestion raisonnable des erreurs et un contrôle du délai d'expiration, les erreurs courantes peuvent être évitées. La maîtrise de ces techniques peut rendre vos demandes simultanées plus stables et efficaces.