L'utilisation de Curl est un choix courant lors du développement de programmes PHP impliquant plusieurs demandes HTTP, en particulier lors de la réalisation d'un grand nombre de demandes d'API. Pour améliorer l'efficacité, PHP fournit une fonction de traitement Curl multithread Curl_Multi_ * , qui peut envoyer plusieurs demandes en parallèle. Cela permet au programme de traiter plusieurs demandes simultanément, plutôt que d'attendre une réponse l'une après l'autre.
Cependant, lorsque nous utilisons CURL multi-thread, nous devons non seulement envoyer des demandes, mais nous devons également obtenir des données telles que l'état d'exécution, les informations d'erreur et le contenu renvoyé de chaque demande en temps réel. La fonction curl_multi_info_read () est l'un des outils qui nous aident à obtenir ces informations.
La fonction curl_multi_info_read () est une fonction de PHP qui obtient l'état d'exécution de plusieurs demandes de curl parallèles. Grâce à celui-ci, les développeurs peuvent surveiller les progrès et l'état d'exécution de chaque demande en temps réel lorsque plusieurs demandes sont en parallèle. Cette fonction renverra un tableau contenant l'état de demande actuel, y compris le code d'état HTTP, si la demande est réussie, etc.
Pour utiliser curl_multi_info_read () , vous devez initialiser une session Curl multithread via curl_multi_init () , puis ajouter plusieurs poignées Curl distinctes à la session via Curl_Multi_Add_handle () . Enfin, vous pouvez utiliser curl_multi_exec () pour exécuter des demandes en parallèle, et utiliser curl_multi_info_read () pour obtenir l'état d'exécution de chaque demande.
Voici un exemple simple:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Initialiser le multithreading cURL Session</span></span><span>
</span><span><span class="hljs-variable">$mh</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_init</span></span><span>();
</span><span><span class="hljs-comment">// Créer plusieurs cURL Poignée</span></span><span>
</span><span><span class="hljs-variable">$ch1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>(</span><span><span class="hljs-string">"https://www.example.com"</span></span><span>);
</span><span><span class="hljs-variable">$ch2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>(</span><span><span class="hljs-string">"https://www.example.org"</span></span><span>);
</span><span><span class="hljs-comment">// installation cURL Options</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch1</span></span><span>, CURLOPT_RETURNTRANSFER, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch2</span></span><span>, CURLOPT_RETURNTRANSFER, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-comment">// Volonté cURL Poignée添加到多线程Session中</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch1</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch2</span></span><span>);
</span><span><span class="hljs-comment">// Exécuter une demande</span></span><span>
</span><span><span class="hljs-keyword">do</span></span><span> {
</span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_exec</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$active</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$active</span></span><span>) {
</span><span><span class="hljs-comment">// Attendez que la demande se termine</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_multi_select</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>);
}
} </span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$active</span></span><span>);
</span><span><span class="hljs-comment">// Obtenez l'état d'exécution de chaque demande</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_info_read</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>)) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'result'</span></span><span>] === CURLE_OK) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Request to "</span></span><span> . </span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'handle'</span></span><span>] . </span><span><span class="hljs-string">" succeeded.\n"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Request to "</span></span><span> . </span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'handle'</span></span><span>] . </span><span><span class="hljs-string">" failed with error: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">curl_error</span></span><span>(</span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'handle'</span></span><span>]) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
}
</span><span><span class="hljs-comment">// Nettoyer</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_multi_remove_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch1</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_multi_remove_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch2</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_multi_close</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
curl_multi_info_read () renvoie un tableau contenant des informations de demande, y compris les champs suivants:
Poignée : la poignée de boucle correspondante.
Résultat : résultat d'exécution. Si la valeur est Curle_ok , la demande est réussie. Si la demande échoue, le code d'erreur correspondant est renvoyé.
MSG : le type de message renvoyé (généralement curlmsg_done , indiquant que la demande a été terminée).
La fonction renvoie un tableau, et s'il n'y a plus d'informations de demande, elle renvoie NULL .
Lorsque plusieurs demandes parallèles sont faites, l'efficacité d'exécution du programme est considérablement améliorée, en particulier lorsqu'il n'y a pas de dépendance directe entre les demandes. En utilisant Curl_Multi_info_Read () , nous pouvons surveiller l'état de chaque demande en temps réel pour garantir que les informations pertinentes peuvent être obtenues à temps, gérer les exceptions ou obtenir des données renvoyées lorsque la demande est terminée.
Avec curl_multi_info_read () nous pouvons:
Obtenez l'état d'exécution de la demande : confirmez si la demande est réussie.
Capturez le message d'erreur demandé : si la demande échoue, le code d'erreur peut être obtenu instantanément pour un traitement ultérieur facile.
Obtenez les données de réponse de la demande en temps réel : si la demande réussit, obtenez les données renvoyées et traitez-la.
curl_multi_info_read () devient particulièrement important dans certains scénarios où les demandes HTTP sont traitées en lots. Par exemple:
Données par lots rampant : demandez plusieurs sites Web en même temps pour obtenir des données et les analyser.
Appel d'API parallèle : lorsque plusieurs API externes doivent être appelées, une demande peut être lancée en même temps pour obtenir les données renvoyées.
Demandes simultanées à grande échelle : Envoyez et traitez efficacement plusieurs demandes pour éviter le blocage.
curl_multi_info_read () fournit un outil puissant et pratique en PHP pour obtenir l'état d'exécution de plusieurs demandes de curl. En utilisant cette fonction raisonnablement, nous pouvons facilement surveiller la progression des demandes parallèles, capturer les informations d'erreur et obtenir les résultats de la demande, améliorant considérablement l'efficacité d'exécution des tâches multi-requêtes. Que ce soit dans le développement de Crawler, les données par lots rampant ou les appels API parallèles, Curl_Multi_info_Read () est un outil indispensable.
Étiquettes associées:
cURL