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 相关文章推荐
在Windows中安装Apache2和PHP4的权威指南
Oct 09 PHP
相对路径转化成绝对路径
Apr 10 PHP
PHP简单系统数据添加以及数据删除模块源文件下载
Jun 07 PHP
Zend的AutoLoad机制介绍
Sep 27 PHP
PHP HTML JavaScript MySQL代码如何互相传值的方法分享
Sep 30 PHP
PHP 获取远程文件大小的3种解决方法
Jul 11 PHP
那些年我们错过的魔术方法(Magic Methods)
Jan 14 PHP
PHP中array_map与array_column之间的关系分析
Aug 19 PHP
微信支付扫码支付php版
Jul 22 PHP
php观察者模式应用场景实例详解
Feb 03 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 PHP
PHP生成随机密码4种方法及性能对比
Dec 11 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显示MySQL数据的三种方法
2008/06/05 PHP
php 生成静态页面的办法与实现代码详细版
2010/02/15 PHP
一致性哈希算法以及其PHP实现详细解析
2013/08/24 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
dvwa+xampp搭建显示乱码的问题及解决方案
2015/08/23 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
微信支付开发告警通知实例
2016/07/12 PHP
js parsefloat parseint 转换函数
2010/01/21 Javascript
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
JavaScript获取表单内所有元素值的方法
2015/04/02 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
2016/06/16 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
学习Angular中作用域需要注意的坑
2016/08/17 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
2017/09/03 Javascript
node上的redis调用优化示例详解
2018/10/30 Javascript
小程序实现抽奖动画
2020/04/16 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
2020/07/22 Javascript
javascript实现数字时钟效果
2021/02/06 Javascript
python实现mysql的读写分离及负载均衡
2018/02/04 Python
通过Pandas读取大文件的实例
2018/06/07 Python
Python绘制动态水球图过程详解
2020/06/03 Python
opencv 图像滤波(均值,方框,高斯,中值)
2020/07/08 Python
店长岗位的工作内容
2013/11/12 职场文书
企业办公室主任岗位职责
2014/02/19 职场文书
公司担保书范文
2014/05/21 职场文书
新闻编辑专业自荐信
2014/07/02 职场文书
护士求职简历自我评价
2015/03/10 职场文书
博士生专家推荐信
2015/03/25 职场文书
部门2015年度工作总结
2015/04/29 职场文书
2016年小学中秋节活动总结
2016/04/05 职场文书
关于感恩的作文
2019/08/26 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
python3读取文件指定行的三种方法
2021/05/24 Python