Tout d'abord, comprenons brièvement les fonctions de base de la série de fonctions Curl_Multi_ * :
curl_multi_init () : initialise une poignée multiplexée pour gérer plusieurs poignées de curl.
curl_multi_add_handle () : Ajoutez une poignée en boucle à la poignée multiplexée.
curl_multi_remove_handle () : supprime une poignée de boucle de la poignée multiplexée.
curl_multi_exec () : exécute toutes les demandes ajoutées à la poignée multiplexée.
curl_multi_close () : fermez la poignée de multiplexage et nettoyez les ressources.
curl_close () : ferme une poignée de session Curl distincte et libère toutes les ressources associées à la poignée.
curl_multi_remove_handle () : supprime une poignée de boucle de la poignée multiplexée, mais ne ferme pas directement la session Curl. Après le retrait, la poignée reste valide et peut être utilisée ailleurs ou fermée.
Nous devons clarifier deux choses:
curl_multi_remove_handle () est une poignée de multiplexage de l'opération, pas une session fermée . L'appel de cette fonction ne met pas fin à la demande, et il ne publie pas de ressources liées à la session Curl.
Curl_close () libère la ressource , et lorsque nous appelons Curl_close () , la poignée Curl pertinente est détruite, nous ne voulons donc pas le détruire tant que la poignée n'est pas retirée.
Sur la base de ces caractéristiques, nous analysons l'ordre des appels:
Ceci est l'ordre recommandé. parce que:
Lorsque vous retirez la poignée de boucle, elle sera déconnectée de la poignée multiplexée, mais ne ferme pas la session. Vous pouvez effectuer d'autres opérations sur la poignée plus tard (comme l'exploitation forestière ou le débogage).
Si vous appelez Curl_close () en premier, la session sera fermée directement et la poignée ne peut pas fonctionner plus tard.
Cette commande est erronée car:
Une fois Curl_close () appelé, la session Curl sera détruite et les ressources pertinentes seront publiées. Vous ne pouvez plus rien faire à une poignée fermée, y compris le retirer d'une poignée multiplexée.
Même si vous souhaitez supprimer la session de la poignée multiplexée, les ressources pertinentes peuvent avoir été libérées à l'intérieur de la boucle, résultant en une erreur imprévisible.
Par conséquent, cette ordonnance peut entraîner des accidents de programme ou un comportement non défini.
Un processus standard doit être:
Utilisez curl_multi_add_handle () pour ajouter chaque session Curl à la poignée multiplexée.
Appelez CURL_MULTI_EXEC () pour exécuter et attendre la réponse.
Utilisez Curl_Multi_Remove_Handle () pour supprimer les sessions Curl terminées ou non nécessaires des poignées multiplexées.
Enfin, appelez curl_close () pour fermer chaque session Curl et libérer les ressources pertinentes.
Appelez Curl_Multi_Close () pour fermer la poignée multiplexée et libérer les ressources pertinentes.
curl_multi_remove_handle () doit être appelé avant curl_close () . L'appel CURL_MULTI_REMOVE_HANDLE () supprime simplement la session Curl de la poignée multiplexée sans libérer la ressource, afin que nous puissions toujours avoir la chance de fermer la session Curl et de libérer la ressource après avoir retiré la poignée. Assurez-vous d'abord d'éviter d'appeler curl_close () , sinon cela provoquera des erreurs que la poignée ne peut pas être supprimée.