Lorsque vous utilisez le traitement multi-request Curl de PHP, Curl_Multi_Close est une fonction très importante qui ferme une manche multimorlose et libère des ressources connexes. Cependant, si vous continuez à accéder à une seule poignée Curl après Curl_Multi_Close , le programme connaîtra un comportement imprévisible et entraînera même de graves erreurs. Pour éviter cela, il est nécessaire de comprendre la bonne méthode de gestion des ressources.
Lorsque vous appelez CURL_MULTI_CLOSE ($ MH) , toutes les ressources associées à $ MH seront marquées comme fermées. Bien qu'une seule poignée CURL (c'est-à-dire créée via Curl_init ) ne soit pas détruite immédiatement, leurs pièces multi-connexions seront invalides. Si vous continuez à utiliser ces poignées ultérieures, des opérations telles que Curl_exec et Curl_getInfo provoqueront des erreurs, ce qui entraînera des exceptions logiques ou des accidents de programme.
Pour éviter le problème de l'accès à la poignée non valide, l'ordre suivant doit être géré:
Exécuter et obtenir tous les résultats de la demande
Retirez chaque poignée de boucle individuelle ( curl_multi_remove_handle )
Fermez chaque poignée de boucle individuelle ( curl_close )
Fermez enfin la manche multi-monnaie ( curl_multi_close )
Cela garantit que chaque ressource est correctement libérée sans dangers cachés.
Voici un exemple complet de gérer correctement les poignées de boucle. Notez que les domaines URL utilisent Gitbox.net :
<?php
// Initialiser multiple cURL Poignée
$ch1 = curl_init();
$ch2 = curl_init();
// installation cURL Options
curl_setopt($ch1, CURLOPT_URL, "https://gitbox.net/api/endpoint1");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_URL, "https://gitbox.net/api/endpoint2");
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
// initialisation multi Poignée
$mh = curl_multi_init();
// 添加单个Poignée到 multi Poignée
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// mettre en œuvre multi Poignée
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
// Obtenir des résultats
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// Retirer et fermer chaque individu cURL Poignée
curl_multi_remove_handle($mh, $ch1);
curl_close($ch1);
curl_multi_remove_handle($mh, $ch2);
curl_close($ch2);
// Dernière clôture multi Poignée
curl_multi_close($mh);
// Réponse de traitement
echo "Response 1: " . $response1 . PHP_EOL;
echo "Response 2: " . $response2 . PHP_EOL;
?>
Si vous écrivez ceci comme suit, il y aura des risques:
<?php
// Démonstration d'erreur,Fermer d'abord multi 再关闭单个Poignée
$ch = curl_init("https://gitbox.net/api/endpoint");
$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch);
// mettre en œuvre请求
$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running > 0);
// erreur!Fermer directement multi Poignée
curl_multi_close($mh);
// Puis fermez le single cURL(Cela peut conduire à un accès aux ressources non valide)
curl_close($ch);
?>
Dans ce code, une fois que Curl_Multi_Close est appelé, des ressources de gestion multi-liées sont publiées. Si Curl_close ($ ch) est suivi, bien qu'une erreur ne soit pas signalée immédiatement la plupart du temps, une erreur grave peut être déclenchée dans certains environnements.
Pour résumer, l'ordre correct de la libération de ressources est très important . N'essayez pas d'accéder ou de fermer une seule poignée après Curl_Multi_Close . Suivre le processus peut strictement éviter de nombreux bogues étranges et s'assurer que le programme est plus robuste.
Supprimer d'abord ( curl_multi_remove_handle )
Fermer Single ( curl_close )
Fermer enfin Multi ( curl_multi_close )
Tant que vous maîtrisez cette règle de base, vous pouvez utiliser des demandes multipliées en file d'attente en toute confiance.