一直在使用thinkphp做项目,同样也经常进行采集!而对于物联卡来说,就更要大量的采集运营商提供的API信息,平时使用PHP单线程curl采集多个网页的时候速度特别慢,尤其是采集几十个接口的时候(电信不提供多个流量卡同时调用数据的接口,只能一个一个的查询);这个速度慢的要死要死的!于是就想到curl多线程采集的问题,最终找到几个效果还是很不错的!解决了采集运营商接口的大难题!测试了一下,采集20条数据的时间为4秒左右,比平时要快2倍了!

既然为了学习,那么先来了解下PHP curl函数信息:

以下是PHP中cURL多线程相关函数:

curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄

curl_multi_close — 关闭一组cURL句柄

curl_multi_exec — 运行当前 cURL 句柄的子连接

curl_multi_getcontent — 如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流

curl_multi_info_read — 获取当前解析的cURL的相关传输信息

curl_multi_init — 返回一个新cURL批处理句柄

curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源

curl_multi_select — 等待所有cURL批处理中的活动连接

curl_multi_setopt — 为 cURL 并行处理设置一个选项

curl_multi_strerror — Return string describing error code

一般来说,想到要用这些函数时,目的显然应该是要同时请求多个URL,而不是一个一个依次请求,否则不如自己循环去调curl_exec好了。

步骤总结如下:

1、调用 curl_multi_init,初始化一个批处理handle

2、循环调用 curl_multi_add_handle,往1中的批处理handle 添加curl_init来的子handle

3、持续调用 curl_multi_exec,直到所有子handle执行完毕。

5、调用 curl_multi_remove_handle,并为每个字handle调用curl_close

好了,直接上函数(输入参数为url数组,返回结果为对应的网页源码数组)

PHP

function curl_multi($urls) {

if (!is_array($urls) or count($urls) == 0) {

return false;

}

$num=count($urls);

$curl = $curl2 = $text = array();

$handle = curl_multi_init();

function createCh($url) {

$ch = curl_init();

curl_setopt ($ch, CURLOPT_URL, $url);

curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko');//设置头部

curl_setopt ($ch, CURLOPT_REFERER, $url); //设置来源

curl_setopt ($ch, CURLOPT_ENCODING, "gzip"); // 编码压缩

curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);//是否采集301、302之后的页面

curl_setopt ($ch, CURLOPT_MAXREDIRS, 5);//查找次数,防止查找太深

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 对认证证书来源的检查

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 从证书中检查SSL加密算法是否存在

curl_setopt ($ch, CURLOPT_TIMEOUT, 20);

curl_setopt ($ch, CURLOPT_HEADER, 0);//输出头部

return $ch;

}

foreach($urls as $k=>$v){

$url=$urls[$k];

$curl[$k] = createCh($url);

curl_multi_add_handle ($handle,$curl[$k]);

}

$active = null;

do {

$mrc = curl_multi_exec($handle, $active);

} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {

if (curl_multi_select($handle) != -1) {

usleep(100);

}

do {

$mrc = curl_multi_exec($handle, $active);

} while ($mrc == CURLM_CALL_MULTI_PERFORM);

}

foreach ($curl as $k => $v) {

if (curl_error($curl[$k]) == "") {

$text[$k] = (string) curl_multi_getcontent($curl[$k]);

}

curl_multi_remove_handle($handle, $curl[$k]);

curl_close($curl[$k]);

}

curl_multi_close($handle);

return $text;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

functioncurl_multi($urls){

if(!is_array($urls)orcount($urls)==0){

returnfalse;

}

$num=count($urls);

$curl=$curl2=$text=array();

$handle=curl_multi_init();

functioncreateCh($url){

$ch=curl_init();

curl_setopt($ch,CURLOPT_URL,$url);

curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko');//设置头部

curl_setopt($ch,CURLOPT_REFERER,$url);//设置来源

curl_setopt($ch,CURLOPT_ENCODING,"gzip");// 编码压缩

curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);//是否采集301、302之后的页面

curl_setopt($ch,CURLOPT_MAXREDIRS,5);//查找次数,防止查找太深

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);// 对认证证书来源的检查

curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);// 从证书中检查SSL加密算法是否存在

curl_setopt($ch,CURLOPT_TIMEOUT,20);

curl_setopt($ch,CURLOPT_HEADER,0);//输出头部

return$ch;

}

foreach($urlsas$k=>$v){

$url=$urls[$k];

$curl[$k]=createCh($url);

curl_multi_add_handle($handle,$curl[$k]);

}

$active=null;

do{

$mrc=curl_multi_exec($handle,$active);

}while($mrc==CURLM_CALL_MULTI_PERFORM);

while($active&&$mrc==CURLM_OK){

if(curl_multi_select($handle)!=-1){

usleep(100);

}

do{

$mrc=curl_multi_exec($handle,$active);

}while($mrc==CURLM_CALL_MULTI_PERFORM);

}

foreach($curlas$k=>$v){

if(curl_error($curl[$k])==""){

$text[$k]=(string)curl_multi_getcontent($curl[$k]);

}

curl_multi_remove_handle($handle,$curl[$k]);

curl_close($curl[$k]);

}

curl_multi_close($handle);

return$text;

}

函数使用:

PHP

$urls=array('http://www.21863.cn',

'http://www.baidu.com',

'http://www.baidu.com',

'http://blog.21863.cn',

'http://www.baidu.com',

'http://www.baidu.com',

'http://www.baidu.com',

'http://www.baidu.com'

);

$res=curl_multi($urls);

print_r($res);

1

2

3

4

5

6

7

8

9

10

11

$urls=array('http://www.21863.cn',

'http://www.baidu.com',

'http://www.baidu.com',

'http://blog.21863.cn',

'http://www.baidu.com',

'http://www.baidu.com',

'http://www.baidu.com',

'http://www.baidu.com'

);

$res=curl_multi($urls);

print_r($res);

而这个多线程的采集函数怎么运用到实际的项目中,这就很简单了吧!

php curl 防止采集,php多线程采集网页的解决办法 curl多线程采集相关推荐

  1. 电脑无故弹出yyy102.html网页的解决办法(没办法,今天中招了)

    电脑无故弹出yyy102.html网页的解决办法 最近不少网民反映电脑隔段时间就会自动弹出某些网站,比如:(千万不要点!!!) http://www.ecommerc-e.com/normal/yyy ...

  2. 能Ping通外网但就是不能打开所有网页的解决办法

    昨天我们办公室有个小妹妹突然打电话告诉我,电脑不能上网了,QQ也不能登陆了! 于是哥哥赶紧跑去一看,哎呀,天啊,这不都市正常的吗?右下角电脑图标显示是正常的(windows 7系统,网络正常的话右下角 ...

  3. 占书明:电脑只能上扣扣QQ和微信,无法打开网页,解决办法!

    占书明:电脑只能上扣扣QQ和微信,无法打开网页,解决办法! 经常有这种,电脑能上扣扣QQ,能上微信,但无法上网,打开网页无法访问,你ping也是可以ping通的,这种情况,现在是越来越多,那么,是怎么 ...

  4. IE浏览器打不开jupyter notebook网页的解决办法

    IE浏览器打不开jupyter notebook网页的解决办法 点击jupyter notebook之后默认IE浏览器打开,网页显示为空白,如下图所示: 首先说明一下,博主通过尝试过网上大量的解决方案 ...

  5. 能上QQ,却不能浏览网页的解决办法

    能上QQ,却不能浏览网页的解决办法 一.感染了病毒所致 这种情况往往表现在打开IE时,在IE界面的左下框里提示:正在打开网页,但老半天没响应.在任务管理器里查看进程,(进入方法,把鼠标放在任务栏上,按 ...

  6. 电脑打不开网页的解决办法

    电脑打不开网页的解决办法 在设置中打开控制面板 查看WLAN的状态属性 找到Internet协议版本4双击进入 启用"使用下面的DNS服务器地址" 在设置中打开控制面板 控制面板- ...

  7. 【Win8不能打开网页的解决办法】

    Win8不能打开网页的解决办法 1.确保电脑连接上网络,大家可以使用Ping命令检查下网络是否有问题 我们可以在Win8系统中,按Win8+R组合快捷键打开开始运行对话框,然后输入:ping www. ...

  8. 马克斯采集土豆视频失败的解决办法:曲线采集

    用马克斯采集土豆视频的时候出现了一些问题,最终导致采集失败了.究其原因是因为 在写采集规则的时候写不出能正确获取到待采集内容页也的正确地址的规则. 下面是采集目标网站的视频列表页的一个视频的列表代码: ...

  9. 狂雨小说采集的小说封面图片不显示解决办法

    狂雨小说CMS(KYXSCMS)是一个非常好用的轻量级小说网站解决方案.系统内置采集模块,使用采集规则可以很方便地自动采集大量小说.文章数据. 但是,个别情况下可能会出现小说的封面图片不显示,主要分为 ...

最新文章

  1. python快速入门答案-python快速入门基础知识
  2. kafka系列文章索引
  3. C语言的叙述大小写字母e1相同,第1、2章C语言基础练习题
  4. php ftp 下载大文件,文件在用php(ftp)下载后损坏[重复]
  5. 大数据之-Hadoop之HDFS_HDFS_副本数量设置---大数据之hadoop工作笔记0053
  6. 从程序员角度--解决ipad白苹果问题的最佳办法---纠正网上的错误言论
  7. inno setup 打包脚本学习
  8. Graphviz样例之有向图
  9. 如何打开.hdx文件
  10. 201711671132《java实用教程》第一章学习总结
  11. 曲苑杂坛(一):互联网如今这么卷,我们该怎么做?
  12. spring boot 使用 bboss 操作 ES
  13. word使用:默认粘贴方式的更改
  14. 论文阅读-WARP: Word-level Adversarial ReProgramming
  15. 快手磁力聚星浪漫七夕活动圆满收官
  16. Building a Restful Web Service(最好的Spring入门教程 --来自Spring官网的Guides)
  17. 领导拒绝涨薪?我直接跳槽,涨薪6k
  18. ssm实现敏感词过滤
  19. 三星服务器链接在哪个文件夹,三星手机无线连接,访问局域网电脑共享目录中的电影照片设置教程...
  20. 物联网的发展前景怎么样?

热门文章

  1. 【模拟】Codeforces 705A Hulk
  2. Linux环境变量中PS1
  3. [android网络有效性检测] NetworkMonitor代码造成内存泄漏
  4. Cocos2dx-如何利用NDK分析崩溃日志
  5. 微软BI 之SSIS 系列 - MVP 们也不解的 Scrip Task 脚本任务中的一个 Bug
  6. 转:sqlserver2005安装时提示“无法找到产品SQLXml4的安装包。
  7. 不能执行已经释放掉的Script代码!(已解决)
  8. 在ubuntu下安装memcache
  9. [Python图像识别] 四十九.图像生成之什么是生成对抗网络GAN?基础原理和代码普及
  10. SwiftUI之深入解析@StateObject、@ObservedObject和@EnvironmentObject的联系和区别