Home >Backend Development >PHP Tutorial >Analysis of methods for implementing multi-threading using foreach combined with curl in PHP

Analysis of methods for implementing multi-threading using foreach combined with curl in PHP

高洛峰
高洛峰Original
2016-12-21 11:46:471260browse

The example in this article describes the method of using foreach combined with curl to achieve multi-threading in PHP. Share it with everyone for your reference, the details are as follows:

Multi-threading is not supported by PHP, but we can use foreach to pseudo-multi-thread, but this pseudo-multi-threading is not necessarily faster than single-threading. Specifically, Let’s look at an example.

When using the foreach statement to loop through image URLs and save all images locally through CURL, a problem arises that only one can be collected. Now we will combine foreach and CURL to make multiple URL requests. Summary below.

Method 1: Loop request

$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);

What needs special attention in the above code is that curl_close must be placed outside the end of the foreach loop. If it is placed inside, the problem I mentioned above will appear. Multiple IMGURLs can only collect one URL.

Method 2: Multi-threaded loop

<?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.php.cn&#39;,
 &#39;http://tools.php.cn&#39;,
));

Here we mainly use curl_multi_init() to implement multiple url requests, but because PHP itself does not support multi-threading , so the speed of pseudo-multithreading is not necessarily faster than that of single-threading.

I hope this article will be helpful to everyone in PHP programming.


For more analysis on the method of foreach combined with curl to achieve multi-threading in PHP, please pay attention to the PHP Chinese website!


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn