Dans PHP, Curl est une bibliothèque puissante qui peut nous aider à envoyer des demandes HTTP et à obtenir des réponses. En utilisant les ensembles de fonctions curl_multi_ * , en particulier Curl_Multi_Close , plusieurs demandes Curl peuvent être traitées simultanément. Lorsque nous terminons l'opération sur plusieurs poignées Curl, la fermeture de la poignée à l'aide de Curl_Multi_Close est une étape importante. Cependant, si nous ne libérons pas correctement les ressources pertinentes, cela peut entraîner des fuites et des erreurs de mémoire.
Cet article présentera comment libérer correctement les ressources après avoir utilisé la fonction Curl_Multi_Close , évitant ainsi les fuites et les erreurs de mémoire.
Dans PHP, la fonction Curl_Multi_ * vous permet de traiter simultanément plusieurs demandes Curl. CURL_MULTI_INIT est utilisé pour initialiser plusieurs poignées Curl, Curl_Multi_Add_Handle est utilisée pour ajouter chaque poignée Curl individuelle à la poignée Curl multiple, et Curl_Multi_EXEC est utilisé pour effectuer toutes les demandes. Une fois toutes les demandes terminées, nous utilisons Curl_Multi_Close pour fermer ces poignées.
Exemple de code:
$multiCurl = curl_multi_init();
$curlHandles = [];
for ($i = 0; $i < 3; $i++) {
$curlHandles[$i] = curl_init("https://gitbox.net/api/data?id=$i");
curl_setopt($curlHandles[$i], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiCurl, $curlHandles[$i]);
}
$running = null;
do {
curl_multi_exec($multiCurl, $running);
} while ($running);
foreach ($curlHandles as $ch) {
$response = curl_multi_getcontent($ch);
echo $response . "\n";
}
// Fermez toutes les poignées
curl_multi_close($multiCurl);
Après avoir utilisé CURL_MULTI_CLOSE , bien qu'il ferme les multiples poignées CURL, les poignées Curl individuelles restent jusqu'à ce qu'elles soient explicitement libérées. Si nous ne libérons pas ces poignées, elles continueront à prendre de la mémoire, ce qui peut conduire à des fuites de mémoire.
Pour s'assurer que les ressources sont correctement libérées, Curl_close doit être explicitement appelé après la fermeture des multiples poignées de curl pour libérer chaque poignée de boucle individuelle.
// Fermer chacun cURL Poignée
foreach ($curlHandles as $ch) {
curl_close($ch);
}
Cela garantit qu'après Curl_Multi_Close , chaque poignée Curl est également correctement libérée, en évitant les fuites de mémoire.
Une erreur peut être rencontrée lors de l'exécution de plusieurs demandes de curl. Lors de la gestion de ces erreurs, il est important de s'assurer que la poignée de boucle est correctement fermée lorsque l'erreur se produit. Même si une erreur se produit, vous devez toujours nettoyer les ressources à la fin.
Exemple de code d'erreur:
$multiCurl = curl_multi_init();
$curlHandles = [];
for ($i = 0; $i < 3; $i++) {
$curlHandles[$i] = curl_init("https://gitbox.net/api/data?id=$i");
curl_setopt($curlHandles[$i], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiCurl, $curlHandles[$i]);
}
$running = null;
do {
$execReturn = curl_multi_exec($multiCurl, $running);
if ($execReturn !== CURLM_OK) {
echo "Error occurred while executing multi requests.\n";
break;
}
} while ($running);
foreach ($curlHandles as $ch) {
if (curl_errno($ch)) {
echo "cURL error: " . curl_error($ch) . "\n";
} else {
$response = curl_multi_getcontent($ch);
echo $response . "\n";
}
curl_close($ch);
}
curl_multi_close($multiCurl);
Ce code garantit que même si une erreur se produit, toutes les poignées de curl sont libérées, évitant ainsi la fuite des ressources.
Après avoir utilisé CURL_MULTI_CLOSE , n'oubliez pas de fermer chaque poignée CURL séparément, en utilisant Curl_close .
Lorsqu'une erreur se produit, assurez-vous que toutes les ressources sont toujours libérées et évitez les fuites de mémoire.
curl_multi_close ne peut fermer que plusieurs poignées de curl, mais ne peut pas fermer automatiquement les poignées de curl séparées. Ils doivent être nettoyés manuellement.
Suivre ces meilleures pratiques peut vous aider à éviter les fuites et les erreurs de mémoire et à rendre votre programme plus efficace et stable.