Lorsque vous utilisez des extensions CURL dans PHP, la fonction Curl_Multi_ * est généralement utilisée pour gérer plusieurs demandes simultanées. Ces fonctions peuvent considérablement améliorer les performances de votre programme, en particulier lorsque plusieurs demandes HTTP sont envoyées simultanément. Cependant, lors de l'utilisation de la fonction Curl_Multi_Close , certains développeurs peuvent rencontrer des problèmes d'interférence dans le traitement des demandes, ce qui a permis de ne pas être terminé correctement ou de renvoyer une erreur.
Cet article explorera comment éviter les interférences dans le traitement des demandes et partager certains exemples et solutions de code pratiques.
PHP fournit la fonction Curl_Multi_ * pour effectuer plusieurs demandes Curl simultanées. Les fonctions principales sont:
curl_multi_init () : initialisez une poignée multiple en curl.
curl_multi_add_handle () : ajoutez plusieurs poignées de curl à une poignée multiple.
curl_multi_exec () : exécute toutes les demandes de curl.
curl_multi_getContent () : obtient le contenu d'une demande Curl.
curl_multi_remove_handle () : supprime une poignée de boucle d'une poignée multiple.
curl_multi_close () : Fermez toutes les poignées Curl et libérez les ressources.
<?php
$multiHandle = curl_multi_init();
$urls = [
'https://gitbox.net/api/endpoint1',
'https://gitbox.net/api/endpoint2',
'https://gitbox.net/api/endpoint3'
];
$handles = [];
// Initialiser plusieurs poignées de demande
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$handles[] = $ch;
}
// Exécuter une demande
$running = null;
do {
curl_multi_exec($multiHandle, $running);
} while ($running);
// Obtenir des données de réponse
foreach ($handles as $ch) {
$response = curl_multi_getcontent($ch);
echo $response . "\n";
curl_multi_remove_handle($multiHandle, $ch);
}
// Fermez la poignée
curl_multi_close($multiHandle);
?>
Bien que la fonction curl_multi_close soit une fonction de nettoyage pratique, elle peut parfois interférer au dernier stade du traitement de la demande, en particulier lorsque Curl_Multi_Close est appelé lorsque la demande n'est pas terminée. Cette ingérence peut entraîner la fin de certaines demandes ou la réponse reçue est incomplète.
Le délai d'achèvement des demandes simultanées est incohérente : en raison des différents temps de réponse des différentes demandes, certaines demandes peuvent ne pas avoir été remplies lorsque Curl_Multi_Close est appelée, ce qui entraîne la clôture de la demande à l'avance.
Problèmes de libération des ressources : dans certains cas, appeler CURL_MULTI_CLOSE avant que la ressource ne soit complètement libérée peut affecter d'autres demandes ou entraîner la déconnexion de la connexion.
Afin d'éviter les interférences dans le traitement de la demande de la fonction Curl_Multi_Close , les stratégies suivantes peuvent être adoptées:
Assurez-vous que toutes les demandes sont remplies avant d'appeler Curl_Multi_Close . Vous pouvez confirmer si toutes les demandes ont été remplies en vérifiant l'état d'exécution renvoyé par Curl_Multi_Exec . curl_multi_close ne doit être appelé que lorsque toutes les demandes sont traitées.
<?php
$multiHandle = curl_multi_init();
$urls = [
'https://gitbox.net/api/endpoint1',
'https://gitbox.net/api/endpoint2',
'https://gitbox.net/api/endpoint3'
];
$handles = [];
// Initialiser plusieurs poignées de demande
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$handles[] = $ch;
}
// Exécuter une demande
$running = null;
do {
$mrc = curl_multi_exec($multiHandle, $running);
if ($mrc > 0) {
echo "CURL exec error: " . curl_multi_strerror($mrc);
}
} while ($running);
// Obtenir des données de réponse
foreach ($handles as $ch) {
$response = curl_multi_getcontent($ch);
echo $response . "\n";
curl_multi_remove_handle($multiHandle, $ch);
}
// Fermez la poignée
curl_multi_close($multiHandle);
?>
Dans certains cas, Curl_Multi_Select () peut être utilisé pour optimiser les performances du traitement de la demande. Au lieu de sonder constamment Curl_Multi_EXEC , il peut bloquer les processus en attendant que la demande de curl soit terminée, ce qui réduit l'utilisation du processeur et assure un traitement en douceur des demandes.
<?php
$multiHandle = curl_multi_init();
$urls = [
'https://gitbox.net/api/endpoint1',
'https://gitbox.net/api/endpoint2',
'https://gitbox.net/api/endpoint3'
];
$handles = [];
// Initialiser plusieurs poignées de demande
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$handles[] = $ch;
}
// Exécuter une demande并使用 curl_multi_select Améliorer les performances
$running = null;
do {
$mrc = curl_multi_exec($multiHandle, $running);
if ($mrc > 0) {
echo "CURL exec error: " . curl_multi_strerror($mrc);
}
curl_multi_select($multiHandle);
} while ($running);
// Obtenir des données de réponse
foreach ($handles as $ch) {
$response = curl_multi_getcontent($ch);
echo $response . "\n";
curl_multi_remove_handle($multiHandle, $ch);
}
// Fermez la poignée
curl_multi_close($multiHandle);
?>
Pour éviter les interférences dans le traitement des demandes , nous devons nous assurer que toutes les demandes ont été remplies et que la réponse a été retournée correctement. Vous pouvez surveiller l'état d'exécution de la demande, utiliser Curl_Multi_Select pour optimiser les performances et vous assurer que Curl_Multi_Close est appelé une fois la demande terminée pour éviter d'éventuelles interférences.
Grâce à ces méthodes, la stabilité et les performances des demandes simultanées dans PHP peuvent être efficacement améliorées, garantissant que le processus de traitement des demandes est fluide et qu'il n'y a pas d'interférence inutile.