Les transferts multi-cURL se terminent dans leur propre ordre. Si vous avez attribué un proxy différent à chaque handle, le premier résultat terminé n'appartient pas forcément au premier proxy de votre liste d'entrée.

Joignez un identifiant de transfert stable lors de la configuration de chaque handle. Si vous testez des points de terminaison publics sélectionnables, la liste de proxys HTTP fournit des candidats HTTP. PHP expose le mécanisme de données privées de libcurl :

$id = 'job-17';
curl_setopt($handle, CURLOPT_PROXY, 'http://203.0.113.10:8080');
curl_setopt($handle, CURLOPT_PRIVATE, $id);

Lorsque curl_multi_info_read() signale un transfert terminé, utilisez le handle renvoyé pour récupérer l'identifiant :

$id = curl_getinfo($message['handle'], CURLINFO_PRIVATE);

Tenez un enregistrement applicatif indexé par cet identifiant contenant la destination, le proxy configuré et le numéro de tentative. Une nouvelle tentative via un autre proxy mérite un nouvel enregistrement de tentative, même si elle relève de la même tâche globale.

Gardez trois types d'adresses distincts

Le point de terminaison du proxy configuré est l'adresse fournie à cURL. L'adresse homologue d'une connexion décrit la connexion réseau ouverte par cURL. Une IP de sortie observée par la destination est une information rapportée par l'autre côté. Elles peuvent différer, surtout avec des proxys en chaîne ou gérés par un fournisseur.

Les métadonnées privées enregistrent votre configuration prévue ; elles ne peuvent pas prouver quelle IP la destination a observée. Inversement, la réponse IP d'une destination ne vous dit pas automatiquement quel handle de votre programme l'a produite.

Stockez un identifiant de proxy sûr dans les journaux de routine. Si le point de terminaison complet contient des identifiants, journaliser cette URL à chaque transfert échoué dissémine le mot de passe dans toute votre collecte d'erreurs.

Cette petite étape de comptabilité rend les résultats mixtes plus faciles à lire : une tâche, une tentative, un proxy choisi et un résultat réel. Elle évite aussi de s'appuyer sur des représentations accidentelles du handle qui ont changé entre les API cURL de PHP basées sur les ressources et sur les objets.

Articles similaires