Position actuelle: Accueil> Derniers articles> CURL_MULTI_CLOSE Problème de synchronisation des données lorsqu'il est utilisé avec Curl_getInfo

CURL_MULTI_CLOSE Problème de synchronisation des données lorsqu'il est utilisé avec Curl_getInfo

gitbox 2025-05-12

Dans PHP, la série de fonctions Curl_Multi_ * offre la possibilité de traiter plusieurs demandes Curl de manière asynchrone, ce qui est utile pour les scénarios où plusieurs URL sont demandées en même temps et en attente de résultats. Dans ces demandes asynchrones, Curl_getInfo est utilisée pour obtenir des informations détaillées sur chaque demande, telles que le code d'état HTTP, l'URL demandée, le temps de transmission, etc. Cependant, lors de la fermeture d'une session multi-Curl à l'aide de Curl_Multi_Close , comment obtenir correctement les développeurs et traitent les informations de retour de chaque demande pour éviter les problèmes de synchronisation de données est devenu un problème commun pour les développeurs dans le développement réel.

Cet article discutera de la façon de garantir que les informations détaillées de la demande sont correctement obtenues via Curl_getInfo lors du traitement de plusieurs demandes à l'aide de Curl_Multi_Close , et éviter les problèmes de synchronisation des données causés par un calage de clôture de la demande incorrecte.

1. Comprendre l'utilisation de base des fonctions Curl_Multi_ * et Curl_getInfo

Dans PHP, la fonction Curl_Multi_ * nous permet d'initier plusieurs demandes Curl simultanément et de les traiter en parallèle via plusieurs threads. Par exemple, utilisez Curl_Multi_Init pour initialiser un ensemble de poignées Curl, utilisez Curl_Multi_Add_Handle pour ajouter plusieurs poignées Curl, puis exécutez via CURL_MULTI_EXEC et attendez que toutes les demandes se terminent. Enfin, fermez la session à l'aide de curl_multi_close .

Voici un exemple simple:

 $mh = curl_multi_init();  // initialisation multi curl Poignée
$ch1 = curl_init("http://gitbox.net/api/data1");  // demander 1
$ch2 = curl_init("http://gitbox.net/api/data2");  // demander 2

curl_multi_add_handle($mh, $ch1);  // 添加demander 1
curl_multi_add_handle($mh, $ch2);  // 添加demander 2

do {
    $mrc = curl_multi_exec($mh, $active);
} while ($active && $mrc == CURLM_OK);

curl_multi_remove_handle($mh, $ch1);  // 移除demander 1
curl_multi_remove_handle($mh, $ch2);  // 移除demander 2

curl_multi_close($mh);  // fermeture multi curl Poignée

2. La cause profonde des problèmes de synchronisation des données

Lorsque plusieurs demandes sont exécutées simultanément, nous voulons généralement pouvoir obtenir leurs coordonnées une fois toutes les demandes terminées. La fonction Curl_getInfo est utilisée pour obtenir des informations d'exécution pour chaque demande CURL, telles que le code d'état renvoyé ( CurlinFO_HTTP_CODE ) et d'autres métadonnées. Cependant, puisque plusieurs demandes sont faites de manière asynchrone et en parallèle, Curl_getInfo doit être appelée au moment approprié pour s'assurer que les données ne sont pas récupérées avant que la demande n'ait été entièrement exécutée.

Si vous appelez Curl_getInfo avant la fin de la demande, vous pouvez vous tromper ou des données incomplètes. Par conséquent, un moment raisonnable de synchronisation est très important.

3. Corrigez la politique d'ordre d'utilisation et la politique de synchronisation

3.1 Gérer les demandes simultanées via Curl_Multi_Select

Lorsque vous appelez CURL_MULTI_EXEC pour effectuer plusieurs demandes, PHP entrera une boucle jusqu'à ce que toutes les demandes soient exécutées. Dans ce processus, Curl_Multi_Select peut également nous aider à gérer l'attente des événements, ce qui nous permet de mieux contrôler quand obtenir le résultat de la demande.

 do {
    // 等待demander完成
    $mrc = curl_multi_exec($mh, $active);

    // Attendez que les données soient prêtes
    if ($active) {
        curl_multi_select($mh);
    }
} while ($active && $mrc == CURLM_OK);

3.2 Assurez-vous d'obtenir des données après avoir retiré la poignée

Une fois toutes les demandes terminées et que toutes les manches sont supprimées, c'est le bon moment pour obtenir les informations de demande. Sinon, si vous fermez la poignée à l'avance, vous pouvez manquer le résultat de certaines demandes.

 // 获取demander信息
$info1 = curl_getinfo($ch1);
$info2 = curl_getinfo($ch2);

// Informations sur la sortie
echo "Request 1 HTTP Code: " . $info1['http_code'] . "\n";
echo "Request 2 HTTP Code: " . $info2['http_code'] . "\n";

3.3 Utilisez CURL_MULTI_REMOVE_HANDLE pour supprimer la poignée

Après avoir obtenu les données, n'oubliez pas de supprimer chaque poignée de la session Curl_Multi et fermez-les à la fin. Cela garantit qu'il n'y a plus de tentatives pour obtenir les résultats de la demande fermée.

 curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);

4. Exemple de code: application complète

Combiné avec le susmentionné, voici un exemple plus complet montrant comment obtenir correctement les détails de chaque demande et vous assurer qu'il n'y a pas de problèmes de synchronisation des données:

 $mh = curl_multi_init();  // initialisation multi curl Poignée
$ch1 = curl_init("http://gitbox.net/api/data1");  // demander 1
$ch2 = curl_init("http://gitbox.net/api/data2");  // demander 2

curl_multi_add_handle($mh, $ch1);  // 添加demander 1
curl_multi_add_handle($mh, $ch2);  // 添加demander 2

// 执行demander并等待完成
do {
    $mrc = curl_multi_exec($mh, $active);
    if ($active) {
        curl_multi_select($mh);  // Attendez que les données soient prêtes
    }
} while ($active && $mrc == CURLM_OK);

// 获取demander的执行信息
$info1 = curl_getinfo($ch1);
$info2 = curl_getinfo($ch2);

// 输出demander信息
echo "Request 1 HTTP Code: " . $info1['http_code'] . "\n";
echo "Request 2 HTTP Code: " . $info2['http_code'] . "\n";

// 移除Poignée
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);

// fermeture multi curl Poignée
curl_multi_close($mh);

en conclusion

En utilisant correctement CURL_MULTI_EXEC et CURL_MULTI_SELECT , et en s'assurant que les informations sont obtenues via Curl_getInfo une fois la demande terminée, les problèmes de synchronisation des données causés par les demandes asynchrones peuvent être effectivement évitées. Pour le traitement des demandes simultanées, le moment est crucial. Une stratégie d'ordre d'appel raisonnable et de synchronisation peut garantir que les données correctes sont obtenues.