cURL multi批处理实现及避免cURL multi造成CPU负载过高问题

cURL multi批处理实现及避免cURL multi造成CPU负载过高问题


=============================

cURL multi这些函数时,目的显然应该是要同时请求多个url,而不是一个一个依次请求,否则不如自己循环去调curl_exec好了。


http://php.net/manual/en/function.curl-multi-exec.php
http://php.net/manual/zh/function.curl-multi-exec.php

这只返回错误关于整个多堆栈。 有可能还有 发生的问题对个别情况,即使这个函数返回CURLM_OK

Note:

This only returns errors regarding the whole multi stack. There might still have occurred problems on individual transfers even when this function returns CURLM_OK.

==================================================================


http://www.phpddt.com/php/curl_multi.html

简单的cURL处理如下:


  
  
  1. $ch = curl_init();
  2. curl_setopt($ch, CURLOPT_URL, 'http://www.phpddt.com');
  3. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  4. $con = curl_exec($ch);
  5. curl_close($ch);

cURL还提供了批量处理会话,下面是 cURL批量处理相关函数:
  • curl_multi_init — 返回一个新cURL批处理句柄
  • curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄
  • curl_multi_exec — 解析一个cURL批处理句柄
  • curl_multi_getcontent — 如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流
  • curl_multi_select — 等待所有cURL批处理中的活动连接
  • curl_multi_info_read — 获取当前解析的cURL的相关传输信息
  • curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
  • curl_multi_close — 关闭一组cURL句柄

看下面使用 curl multi批处理的例子

    
    
  1. <?php
  2. /**
  3. * cURL multi批量处理
  4. *
  5. * @author mckee
  6. * @link http://www.phpddt.com
  7. *
  8. */
  9.  
  10. $url_array = array(
  11. 'http://www.phpddt.com/',
  12. 'http://www.phpddt.com/php/627.html',
  13. 'http://www.phpddt.com/php/258.html'
  14. );
  15.  
  16. $handles = $contents = array();
  17.  
  18. //初始化curl multi对象
  19. $mh = curl_multi_init();
  20.  
  21. //添加curl 批处理会话
  22. foreach($url_array as $key => $url)
  23. {
  24. $handles[$key] = curl_init($url);
  25. curl_setopt($handles[$key], CURLOPT_RETURNTRANSFER, 1);
  26. curl_setopt($handles[$key], CURLOPT_TIMEOUT, 10);
  27. curl_multi_add_handle($mh, $handles[$key]);
  28. }
  29.  
  30. //======================执行批处理句柄=================================
  31. $active = null;
  32. do {
  33. $mrc = curl_multi_exec($mh, $active);
  34. } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  35.  
  36.  
  37. while ($active and $mrc == CURLM_OK) {
  38. if(curl_multi_select($mh) === -1){
  39. usleep(100);
  40. }
  41. do {
  42. $mrc = curl_multi_exec($mh, $active);
  43. } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  44.  
  45. }
  46. //====================================================================
  47.  
  48. //获取批处理内容
  49. foreach($handles as $i => $ch)
  50. {
  51. $content = curl_multi_getcontent($ch);
  52. $contents[$i] = curl_errno($ch) == 0 ? $content : '';
  53. }
  54.  
  55. //移除批处理句柄
  56. foreach($handles as $ch)
  57. {
  58. curl_multi_remove_handle($mh, $ch);
  59. }
  60.  
  61. //关闭批处理句柄
  62. curl_multi_close($mh);
  63.  
  64. print_r($contents);

上面这段程序重点是执行批处理的那段,普通的处理:

    
    
  1. do { $n=curl_multi_exec($mh,$active); } while ($active);

会造成CPU Loading过高,因为$active要等全部url数据接受完毕才变成false,所以这里用到了 curl_multi_exec的返回值判断是否还有数据,当有数据的时候就不停调用curl_multi_exec,没有执行数据就会sleep,如此就会避免CPU Loading 100%了。
参考资料:
(1) PHP手册关于cURL教程
(2) curl预定义常量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值