Lorsque vous utilisez la fonction Curl_Multi_ * dans PHP, nous pouvons lancer plusieurs demandes HTTP en même temps pour améliorer la concurrence du programme. La fonction CURL_MULTI_CLOSE est utilisée pour fermer toutes les demandes simultanées, mais comment s'assurer qu'elle ferme correctement toutes les demandes et évite les omissions est toujours une préoccupation.
Avant de discuter de la façon de fermer correctement une demande, nous devons d'abord comprendre comment fonctionne la fonction Curl_Multi_ * . Les fonctions Curl_Multi_ * Series sont principalement:
curl_multi_init () : initialisez une poignée multiple en curl.
curl_multi_add_handle () : ajoute la poignée Curl à la poignée multiple.
curl_multi_exec () : exécute toutes les demandes ajoutées aux multiples poignées.
curl_multi_getContent () : obtient le contenu de retour de la poignée spécifiée.
curl_multi_close () : fermez toutes les poignées ajoutées via curl_multi_add_handle () .
Ces fonctions sont souvent utilisées en conjonction les unes avec les autres pour gérer efficacement plusieurs demandes simultanées.
Dans la gestion des demandes multi-concurrentes, l'un des problèmes les plus courants est que lorsque Curl_Multi_Close est appelé, toutes les poignées de demande ne sont pas fermées correctement. Cela entraînera une fuite de ressources et affectera la stabilité du programme.
Habituellement, le problème se produit dans les situations suivantes:
J'ai oublié de vérifier si Curl_Multi_EXEC remplit toutes les demandes.
Avant Curl_Multi_Close , chaque poignée n'a pas été supprimée correctement.
Une mauvaise gestion des ressources entraîne des poignées d'arrêt incohérentes.
Pour s'assurer que toutes les demandes sont clôturées correctement lorsque vous utilisez Curl_Multi_Close , nous devons suivre ces étapes:
Tout d'abord, nous initialisons une poignée multiple et initialisons une poignée de boucle séparée pour chaque demande.
$mh = curl_multi_init(); // Initialiser plusieurs poignées
$ch1 = curl_init("https://gitbox.net/api/endpoint1"); // La première demande
$ch2 = curl_init("https://gitbox.net/api/endpoint2"); // La deuxième demande
// Ajouter la poignée de demande à plusieurs poignées
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
Ensuite, nous utilisons CURL_MULTI_EXEC pour exécuter toutes les demandes jusqu'à ce que toutes les demandes soient terminées.
do {
$mrc = curl_multi_exec($mh, $active); // Exécuter une demande
if ($active) {
curl_multi_select($mh); // Attendez que la demande se termine
}
} while ($active && $mrc == CURLM_OK);
Une fois toutes les demandes terminées, nous pouvons utiliser Curl_Multi_getContent pour obtenir le contenu de réponse de chaque demande, puis supprimer chaque poignée des multiples poignées, et enfin fermer toutes les poignées.
// Obtenez le contenu demandé
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// Fermez et retirez chaque poignée
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
// Fermez chaque demande
curl_close($ch1);
curl_close($ch2);
// Enfin, fermez les multiples poignées
curl_multi_close($mh);
Assurez-vous qu'avant d'appeler CURL_MULTI_CLOSE , toutes les poignées sont supprimées correctement et que chaque poignée est fermée. Cela évite la fuite des ressources et l'utilisation de la mémoire inutile.
Dans le développement réel, nous pouvons rencontrer des échecs de demande. Pour s'assurer que toutes les poignées peuvent être fermées correctement dans des situations exceptionnelles, il est recommandé d'ajouter des mécanismes de traitement des captures et des erreurs d'exception pendant l'exécution.
// Ajouter une gestion des exceptions
try {
// Code pour exécuter des demandes simultanées(Comme indiqué ci-dessus)
if ($mrc != CURLM_OK) {
throw new Exception("Error in curl_multi_exec: $mrc");
}
} catch (Exception $e) {
// Catch des exceptions et des ressources fermées
echo "Error: " . $e->getMessage();
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_close($ch1);
curl_close($ch2);
curl_multi_close($mh);
}
De cette façon, même si une erreur se produit, le programme peut toujours nettoyer correctement les ressources.
En utilisant la série Curl_Multi_ * de fonctions raisonnablement et en suivant les points suivants, nous pouvons nous assurer que Curl_Multi_Close peut fermer correctement toutes les demandes simultanées:
Assurez-vous de supprimer chaque poignée avant d'appeler CURL_MULTI_CLOSE .
Lorsque vous utilisez CURL_MULTI_EXEC , attendez que toutes les demandes se terminent.
Gérer les exceptions de manière appropriée pour éviter les poignées non clôturées.
Grâce à ces meilleures pratiques, nous pouvons mieux gérer les demandes simultanées, éviter les fuites de ressources et améliorer la robustesse et les performances du code.