Maison  >  Article  >  développement back-end  >  Exemple d'analyse de foreach combiné avec curl pour réaliser le multi-threading en PHP

Exemple d'analyse de foreach combiné avec curl pour réaliser le multi-threading en PHP

墨辰丷
墨辰丷original
2018-06-01 10:54:131535parcourir

Cet article présente principalement la méthode foreach combinée avec curl pour réaliser le multi-threading en PHP. Il analyse les principes et les techniques d'implémentation de l'instruction foreach combinée avec l'appel de boucle curl pour simuler le multi-threading sous forme d'exemples. besoin peut s'y référer

Le multi-threading n'est pas supporté par PHP, mais on peut utiliser foreach pour faire du pseudo-multi-thread, mais la vitesse de ce pseudo-multi-threading n'est pas forcément plus rapide que celle du simple thread. Jetons un coup d'œil à un exemple.

Lorsque vous utilisez l'instruction foreach pour parcourir les URL d'images et enregistrer toutes les images localement via CURL, un problème survient : une seule image peut maintenant être collectée. résumera la méthode de combinaison de foreach et de CURL pour effectuer plusieurs requêtes d'URL

Méthode 1 : demande de boucle

$sr=array(url_1,url_2,url_3);
foreach ($sr as $k=>$v) {
 $curlPost=$v.'?f=传入参数';
 $ch = curl_init($curlPost) ;
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回
 curl_setopt($ch, CURLOPT_BINARYTRANSFER, true) ; // 在启用 CURLOPT_RETURNTRANSFER 时候将获取数据返回
 $data = curl_exec($ch) ;
 echo $k.&#39;##:&#39;.$data.&#39;<br>&#39;;
}
curl_close($ch);

.

Ce qui nécessite une attention particulière dans le code ci-dessus, c'est que curl_close doit être placé à l'extérieur de la fin de la boucle foreach, s'il est placé à l'intérieur, il y aura plusieurs IMGURL que j'ai mentionnées ci-dessus, et une seule URL pourra être collectée

.

Méthode 2 : Boucle multithread

<?php
multi_threads_request($nodes){
  $mh = curl_multi_init();
  $curl_array = array();
  foreach($nodes as $i => $url)
  {
   $curl_array[$i] = curl_init($url);
   curl_setopt($curl_array[$i], CURLOPT_RETURNTRANSFER, true);
   curl_multi_add_handle($mh, $curl_array[$i]);
  }
  $running = NULL;
  do {
   usleep(10000);
   curl_multi_exec($mh,$running);
  } while($running > 0);
  $res = array();
  foreach($nodes as $i => $url)
  {
   $res[$url] = curl_multi_getcontent($curl_array[$i]);
  }
  foreach($nodes as $i => $url){
   curl_multi_remove_handle($mh, $curl_array[$i]);
  }
  curl_multi_close($mh);
  return $res;
}
print_r(multi_threads_request(array(
 &#39;http://www.jb51.net&#39;,
 &#39;http://tools.jb51.net&#39;,
));

Ici, nous utilisons principalement curl_multi_init() pour implémenter plusieurs Requêtes d'URL. Cependant, comme PHP lui-même ne prend pas en charge le multi-threading, le pseudo-multi-threading n'est donc pas nécessairement plus rapide que le mono-threading

Résumé : ce qui précède est le cas. tout le contenu de cet article, j'espère qu'il sera utile à l'apprentissage de chacun.

Recommandations associées :

phpLisez le fichier côté serveur et affichez-le sur l'instance de page Web

Utilisez php pour interagir avec le serveur et l'interface frontale Web

Utilisez php pour réaliser une connexion automatique mécanisme de stockage dans un délai d'une semaine

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn