php中使用foreach curl多个URL及多线程请求多个URL
在利用foreach语句循环图片URL,并通过CURL将所有图片进行本地保存的函数时 ,出现了只能采集到一个的问题。现将foreach和CURL结合进行多URL请求的方法进行下总如。
方法1:循环请求
1$sr=array(url_1,url_2,url_3);
2foreach ($sr as $k=>$v) {
3 $curlPost=$v.'?f=传入参数';
4 $ch = curl_init($curlPost) ;
5 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回
6 curl_setopt($ch, CURLOPT_BINARYTRANSFER, true) ; // 在启用 CURLOPT_RETURNTRANSFER 时候将获取数据返回
7 $data = curl_exec($ch) ;
8 echo $k.'##:'.$data.'<br>';
9}
10curl_close($ch);
上面代码需要特别注意的是,curl_close 一定要放在foreach循环结束的外面,如果放在里面的话,就会出现我上面提到的多个IMGURL ,只能采集到一个URL的问题。
方法2:多线程循环
1<?php
2multi_threads_request($nodes){
3 $mh = curl_multi_init();
4 $curl_array = array();
5 foreach($nodes as $i => $url)
6 {
7 $curl_array[$i] = curl_init($url);
8 curl_setopt($curl_array[$i], CURLOPT_RETURNTRANSFER, true);
9 curl_multi_add_handle($mh, $curl_array[$i]);
10 }
11 $running = NULL;
12 do {
13 usleep(10000);
14 curl_multi_exec($mh,$running);
15 } while($running > 0);
16 $res = array();
17 foreach($nodes as $i => $url)
18 {
19 $res[$url] = curl_multi_getcontent($curl_array[$i]);
20 }
21 foreach($nodes as $i => $url){
22 curl_multi_remove_handle($mh, $curl_array[$i]);
23 }
24 curl_multi_close($mh);
25 return $res;
26}
27print_r(multi_threads_request(array(
28 'http://www.163.com',
29 'http://www.baidu.com',
30));
这里主要利用curl_multi_init()实现多个url 的请求,不过由于php自身并不支持多线程。所以伪多线程速度也不见得会比单线程快。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/php-foreach-curl/3559.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.