Lorsque vous utilisez l'extension Curl de PHP, la série de fonctions Curl_Multi_ * peut exécuter plusieurs demandes HTTP simultanément. Envoyez des demandes par lots via curl_multi_exec () , puis fermez la poignée à l'aide de curl_multi_close () . Bien que ces fonctions soient puissantes, elles sont sujets à certains pièges lorsqu'ils sont utilisés en conjonction avec curl_setopt () . Ci-dessous, nous discuterons de quelques erreurs courantes et comment les éviter.
Lorsque vous utilisez CURL_MULTI_EXEC () pour traiter plusieurs demandes de traitement, il est généralement nécessaire de définir des options individuelles pour chaque demande. Si curl_setopt () n'est pas défini correctement lors de l'ajout de plusieurs poignées, la demande peut échouer ou renvoyer des résultats incorrects.
$ch1 = curl_init();
$ch2 = curl_init();
curl_setopt($ch1, CURLOPT_URL, 'https://gitbox.net/api/data1');
curl_setopt($ch2, CURLOPT_URL, 'https://gitbox.net/api/data2');
// J'ai oublié de définir d'autres options nécessaires,comme CURLOPT_RETURNTRANSFER
Assurez-vous de définir les options nécessaires pour chaque poignée de boucle . Par exemple:
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_multi_close () et curl_close () sont tous deux utilisés pour fermer les poignées Curl, mais leur portée d'action est différente. curl_close () ne ferme qu'une seule poignée de curl, tandis que curl_multi_close () ferme toutes les poignées dans une demande de curl multiple. L'utilisation de ces deux fonctions incorrectement peut entraîner la publication de la ressource correctement, ou le programme aura une exception dans les demandes ultérieures.
curl_multi_close($multiHandle); // erreur,parce que $multiHandle Plusieurs poignées doivent être fermées
Lorsque vous utilisez plusieurs demandes, vous devez utiliser curl_multi_close () pour fermer plusieurs poignées après avoir terminé la demande et le traitement de chaque poignée:
// Effectuez plusieurs demandes
curl_multi_exec($multiHandle, $running);
// Fermer chaque individu cURL Poignée
curl_close($ch1);
curl_close($ch2);
// Utiliser correctement curl_multi_close()
curl_multi_close($multiHandle);
Parfois, lorsqu'un développeur utilise curl_multi_exec () pour envoyer plusieurs demandes, il peut fermer la connexion prématurément car il n'attend pas que la demande se termine correctement. Étant donné que curl_multi_exec () est exécuté de manière asynchrone, il est nécessaire de s'assurer que toutes les demandes ont été remplies puis d'appeler Curl_Multi_Close () .
// 没有等待请求完成就关闭Poignée
curl_multi_close($multiHandle);
En détectant le paramètre $ en cours d'exécution , assurez-vous que toutes les demandes sont remplies avant de fermer la connexion:
$running = null;
do {
curl_multi_exec($multiHandle, $running);
} while ($running > 0);
curl_multi_close($multiHandle);
Dans certains cas, les développeurs peuvent essayer de réutiliser la même poignée de boucle, ce qui peut facilement conduire à demander des erreurs ou des problèmes de performances. Chaque fois qu'une nouvelle demande est envoyée, une nouvelle poignée de boucle doit être créée et différentes options doivent être définies pour elle.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://gitbox.net/api/data1');
// 复用相同的Poignée
curl_setopt($ch, CURLOPT_URL, 'https://gitbox.net/api/data2'); // erreur,应该创建新的Poignée
Assurez-vous de créer une nouvelle poignée de boucle pour chaque demande:
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, 'https://gitbox.net/api/data1');
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, 'https://gitbox.net/api/data2');
Lorsque curl_multi_exec () exécute une demande, diverses erreurs de réseau ou de serveur peuvent se produire. Afin de pouvoir gérer correctement ces erreurs, Curl_error () et Curl_errno () doivent être utilisés pour le débogage des erreurs.
curl_multi_exec($multiHandle, $running); // Exécuter une demande,但没有处理erreur
Une fois chaque demande terminée, vérifiez et sortant le message d'erreur:
// Exécuter une demande
curl_multi_exec($multiHandle, $running);
// erreur处理
foreach ($handles as $ch) {
if ($errno = curl_errno($ch)) {
echo "cURL error: " . curl_error($ch);
}
}