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 相关文章推荐
php缓存技术介绍
Nov 25 PHP
PHP学习笔记 (1) 环境配置与代码调试
Jun 19 PHP
Zend的AutoLoad机制介绍
Sep 27 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
Jul 05 PHP
php生成图片验证码
Jun 09 PHP
php写入、删除与复制文件的方法
Jun 20 PHP
CodeIgniter常用知识点小结
May 26 PHP
ThinkPHP下表单令牌错误与解决方法分析
May 20 PHP
PHP实现验证码校验功能
Nov 16 PHP
php往mysql中批量插入数据实例教程
Dec 12 PHP
PHP中的self关键字详解
Jun 23 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
Mar 16 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数据饼图效果实现代码
2011/11/23 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
2013/11/07 PHP
fckeditor上传文件按日期存放及重命名方法
2015/05/22 PHP
详解PHP序列化反序列化的方法
2015/10/27 PHP
HTML页面如何象ASP一样接受参数
2007/02/07 Javascript
简单的JS多重继承示例
2008/03/13 Javascript
验证码按回车不变解决方法
2013/03/29 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
jQuery+HTML5加入购物车代码分享
2020/10/29 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
2017/06/26 jQuery
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
2018/01/02 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
2018/09/04 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
2019/09/28 Javascript
[09:37]2018DOTA2国际邀请赛寻真——不懈追梦的Team Serenity
2018/08/13 DOTA
[01:36:19]Secret vs NB 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[35:39]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第二场 11.22
2020/11/24 DOTA
深入Python解释器理解Python中的字节码
2015/04/01 Python
Python处理字符串之isspace()方法的使用
2015/05/19 Python
python中的json总结
2018/10/11 Python
python3.4爬虫demo
2019/01/22 Python
深入解析Python小白学习【操作列表】
2019/03/23 Python
12个步骤教你理解Python装饰器
2019/07/01 Python
tensorflow mnist 数据加载实现并画图效果
2020/02/05 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
铭万公司.net面试题笔试题
2014/07/20 面试题
工作中个人的自我评价
2013/12/31 职场文书
旅游安全协议书
2014/04/21 职场文书
2014年财务个人工作总结
2014/12/08 职场文书
工作简报格式范文
2015/07/21 职场文书
开业庆典致辞
2015/08/01 职场文书