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游戏编程25个脚本代码
Feb 08 PHP
php模块memcache和memcached区别分析
Jun 14 PHP
Linux环境下搭建php开发环境的操作步骤
Jun 17 PHP
php根据身份证号码计算年龄的实例代码
Jan 18 PHP
php+ajax实现图片文件上传功能实例
Jun 17 PHP
php实现的CSS更新类实例
Sep 22 PHP
Yii2 加载css、js 载静态资源的方法
Mar 10 PHP
php mysql数据库操作类(实例讲解)
Aug 06 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
Feb 11 PHP
YII框架常用技巧总结
Apr 27 PHP
Yii框架日志操作图文与实例详解
Sep 09 PHP
php中用unset销毁变量并释放内存
May 10 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数据库的一些要注意的问题
2006/10/09 PHP
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
2008/11/18 PHP
最新制作ThinkPHP3.2.3完全开发手册
2015/11/23 PHP
phpfpm的作用和用法
2019/10/10 PHP
jQuery初学:find()方法及children方法的区别分析
2011/01/31 Javascript
详谈jQuery中的this和$(this)
2014/11/13 Javascript
form表单转Json提交的方法(推荐)
2016/09/23 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
2018/01/03 Javascript
Vue 事件的$event参数=事件的值案例
2021/01/29 Vue.js
[01:21]DOTA2 新英雄 森海飞霞
2020/12/18 DOTA
简单介绍Ruby中的CGI编程
2015/04/10 Python
Django Admin实现上传图片校验功能
2016/03/06 Python
Python的collections模块中namedtuple结构使用示例
2016/07/07 Python
python线程、进程和协程详解
2016/07/19 Python
python脚本实现数据导出excel格式的简单方法(推荐)
2016/12/30 Python
python远程连接服务器MySQL数据库
2018/07/02 Python
使用python的pandas库读取csv文件保存至mysql数据库
2018/08/20 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
2019/05/16 Python
Python 3.8 新功能大揭秘【新手必学】
2020/02/05 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
2020/03/05 Python
python实现控制台输出彩色字体
2020/04/05 Python
Tensorflow使用Anaconda、pycharm安装记录
2020/07/29 Python
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
Hudson Jeans官网:高级精制牛仔裤
2018/11/28 全球购物
趣天网日本站:Qoo10 JP
2019/09/18 全球购物
微博营销计划书
2014/01/10 职场文书
建筑结构施工专业推荐信
2014/02/21 职场文书
后勤服务中心总经理工作职责
2014/03/03 职场文书
会计核算科岗位职责
2014/03/19 职场文书
党员自我评价2015
2015/03/03 职场文书
军训后的感想
2015/08/07 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书
python 机器学习的标准化、归一化、正则化、离散化和白化
2021/04/16 Python
Django+Celery实现定时任务的示例
2021/06/23 Python
Redis如何实现分布式锁
2021/08/23 Redis