php中的curl_multi系列函数使用例子


Posted in PHP onJuly 29, 2014

相信许多人对php手册中语焉不详的curl_multi一族的函数头疼不已,它们文档少,给的例子 更是简单的让你无从借鉴,我也曾经找了许多网页,都没见一个完整的应用例子。

  • curl_multi_add_handle
  • curl_multi_close
  • curl_multi_exec
  • curl_multi_getcontent
  • curl_multi_info_read
  • curl_multi_init
  • curl_multi_remove_handle
  • curl_multi_select

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

步骤总结如下:

第一步:调用curl_multi_init
第二步:循环调用curl_multi_add_handle
这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle。
第三步:持续调用curl_multi_exec
第四步:根据需要循环调用curl_multi_getcontent获取结果
第五步:调用curl_multi_remove_handle,并为每个字handle调用curl_close
第六步:调用curl_multi_close

这里有一个网上找的简单例子,其作者称为dirty的例子,(稍后我会说明为何dirty):

/*

Here's a quick and dirty example for curl-multi from PHP, tested on PHP 5.0.0RC1 CLI / FreeBSD 5.2.1

*/
$connomains = array(

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

"http://www.google.com/",

"https://3water.com/"

);

$mh = curl_multi_init();
foreach ($connomains as $i => $url) {

     $conn[$i]=curl_init($url);

      curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1);

      curl_multi_add_handle ($mh,$conn[$i]);

}
do { $n=curl_multi_exec($mh,$active); } while ($active);
foreach ($connomains as $i => $url) {

      $res[$i]=curl_multi_getcontent($conn[$i]);

      curl_close($conn[$i]);

}
print_r($res);

整个使用过程差不多就是这样,但是,这个简单代码有个致命弱点,就是在do循环的那段,在整个url请求期间是个死循环,它会轻易导致CPU占用100%。

现在我们来改进它,这里要用到一个几乎没有任何文档的函数curl_multi_select了,虽然C的curl库对select有说明,但是,php里的接口和用法确与C中有不同。

把上面do的那段改成下面这样:

           do {

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

                } while ($mrc == CURLM_CALL_MULTI_PERFORM);

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

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

                                do {

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

                                } while ($mrc == CURLM_CALL_MULTI_PERFORM);

                        }

                }

因为$active要等全部url数据接受完毕才变成false,所以这里用到了curl_multi_exec的返回值判断是否还有数据,当有数据的时候就不停调用curl_multi_exec,暂时没有数据就进入select阶段,新数据一来就可以被唤醒继续执行。这里的好处就是CPU的无谓消耗没有了。

另外:还有一些细节的地方可能有时候要遇到:

控制每一个请求的超时时间,在curl_multi_add_handle之前通过curl_setopt去做:

curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);

判断是否超时了或者其他错误,在curl_multi_getcontent之前用:curl_error($conn[$i]);

PHP 相关文章推荐
第一节--面向对象编程
Nov 16 PHP
mysql 字段类型说明
Apr 27 PHP
PHP session会话的安全性分析
Sep 08 PHP
PHP内核介绍及扩展开发指南―基础知识
Sep 11 PHP
具有时效性的php加密解密函数代码
Jun 19 PHP
PHP模板引擎smarty详细介绍
May 26 PHP
PHP基于单例模式实现的数据库操作基类
Jan 15 PHP
Nginx下ThinkPHP5的配置方法详解
Aug 01 PHP
PHP 数组黑名单/白名单实例代码详解
Jun 04 PHP
php常用字符串查找函数strstr()与strpos()实例分析
Jun 21 PHP
thinkphp5实现微信扫码支付
Dec 23 PHP
PHP中mysqli_get_server_version()的实例用法
Feb 03 PHP
PHP使用CURL_MULTI实现多线程采集的例子
Jul 29 #PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
Jul 29 #PHP
PHP自带函数给数字或字符串自动补齐位数
Jul 29 #PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
Jul 29 #PHP
php实现读取超大文件的方法
Jul 28 #PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
Jul 28 #PHP
php Imagick获取图片RGB颜色值
Jul 28 #PHP
You might like
php桌面中心(一) 创建数据库
2007/03/11 PHP
php 显示指定路径下的图片
2009/10/29 PHP
php利用cookie实现访问次数统计代码
2011/05/19 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
2014/12/16 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
jquery使用jxl插件导出excel示例
2014/04/14 Javascript
jQuery toggle 代替方法
2016/03/22 Javascript
jQuery实现的自定义弹出层效果实例详解
2016/09/04 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
微信小程序如何调用json数据接口并解析
2019/06/29 Javascript
jQuery HTML css()方法与css类实例详解
2020/05/20 jQuery
利用Python和OpenCV库将URL转换为OpenCV格式的方法
2015/03/27 Python
Python编程中对文件和存储器的读写示例
2016/01/25 Python
Python实现的下载网页源码功能示例
2017/06/13 Python
分数霸榜! python助你微信跳一跳拿高分
2018/01/08 Python
python实现简易版计算器
2020/06/22 Python
python实现聚类算法原理
2018/02/12 Python
pip安装py_zipkin时提示的SSL问题对应
2018/12/29 Python
详解Django 时间与时区设置问题
2019/07/23 Python
爬虫代理池Python3WebSpider源代码测试过程解析
2019/12/20 Python
python脚本第一行如何写
2020/08/30 Python
Python 创建守护进程的示例
2020/09/29 Python
复古斯堪的纳维亚儿童服装:Baby go Retro
2017/09/09 全球购物
黄色火烈鸟:De Gele Flamingo
2019/03/18 全球购物
幼儿园清明节活动总结
2014/07/04 职场文书
2014年作风建设剖析材料
2014/10/23 职场文书
2014年生活老师工作总结
2014/12/23 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
2015年办公室文秘工作总结
2015/04/30 职场文书
中学综治宣传月活动总结
2015/05/07 职场文书
超市主管竞聘书
2015/09/15 职场文书
Go语言中的UTF-8实现
2021/04/26 Golang