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 相关文章推荐
我的论坛源代码(六)
Oct 09 PHP
php在线生成ico文件的代码
Oct 09 PHP
smarty section简介与用法分析
Oct 03 PHP
PHP动态分页函数,PHP开发分页必备啦
Nov 07 PHP
php根据分类合并数组的方法实例详解
Nov 06 PHP
PHP解决URL中文GBK乱码问题的两种方法
Jun 03 PHP
PHP中soap的用法实例
Oct 24 PHP
PHP框架性能测试报告
May 08 PHP
浅谈php(codeigniter)安全性注意事项
Apr 06 PHP
PHP基于递归实现的约瑟夫环算法示例
Aug 27 PHP
php压缩文件夹最新版
Jul 18 PHP
Laravel框架中缓存的使用方法分析
Sep 06 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
Protoss魔法科技
2020/03/14 星际争霸
Zend framework处理一个http请求的流程分析
2010/02/08 PHP
几款免费开源的不用数据库的php的cms
2010/12/19 PHP
五款常用mysql slow log分析工具的比较分析
2011/05/22 PHP
php设计模式 FlyWeight (享元模式)
2011/06/26 PHP
解析php常用image图像函数集
2013/06/24 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
javascript 自动转到命名锚记
2009/01/10 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
input标签内容改变的触发事件介绍
2014/06/18 Javascript
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
VUE页面中加载外部HTML的示例代码
2017/09/20 Javascript
babel的使用及安装配置教程
2018/02/22 Javascript
JavaScript递归函数解“汉诺塔”算法代码解析
2018/07/05 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
2018/11/12 jQuery
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
JavaScript实现与使用发布/订阅模式详解
2019/01/19 Javascript
解决layer.confirm选择完之后消息框不消失的问题
2019/09/16 Javascript
layui复选框限制选择个数的方法
2019/09/18 Javascript
vue渲染方式render和template的区别
2020/06/05 Javascript
使用纯前端JavaScript实现Excel导入导出方法过程详解
2020/08/07 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
python的常见命令注入威胁
2013/02/18 Python
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
基于python指定包的安装路径方法
2018/10/27 Python
python爬虫 正则表达式解析
2019/09/28 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
2020/03/30 Python
加拿大专业美发产品购物网站:Chatters
2021/02/28 全球购物
香港士多网上超级市场:Ztore
2021/01/09 全球购物
手机被没收的检讨书
2014/10/04 职场文书
2014幼儿园卫生保健工作总结
2014/12/05 职场文书
网络销售员岗位职责
2015/04/11 职场文书
欠条格式范本
2015/07/03 职场文书
教你怎么用python实现字符串转日期
2021/05/24 Python