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与SQL注入攻击[三]
Apr 17 PHP
PHP采集相关教程之一 CURL函数库
Feb 15 PHP
php目录操作函数之获取目录与文件的类型
Dec 29 PHP
php在页面中调用fckeditor编辑器的方法
Jun 10 PHP
php 判断字符串中是否包含html标签
Feb 17 PHP
PHP判断远程图片是否存在的几种方法
May 04 PHP
php 删除cookie方法详解
Dec 01 PHP
PHP实现通用alert函数的方法
Mar 11 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
Sep 11 PHP
深入解析PHP中SESSION反序列化机制
Mar 01 PHP
Windows 下安装 swoole 图文教程(php)
Jun 05 PHP
PHP实现类似于C语言的文件读取及解析功能
Sep 01 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/05/30 PHP
JS实现php的伪分页
2008/05/25 PHP
php 代码优化之经典示例
2011/03/24 PHP
使用PHP生成二维码的方法汇总
2015/07/22 PHP
PHP递归创建多级目录
2015/11/05 PHP
php中的explode()函数实例介绍
2019/01/18 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
理解JavaScript变量作用域更轻松
2009/10/25 Javascript
javascript模拟的Ping效果代码 (Web Ping)
2011/03/13 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
jquery eval解析JSON中的注意点介绍
2013/08/23 Javascript
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
JQuery中阻止事件冒泡几种方式及其区别介绍
2014/01/15 Javascript
jquery禁用右键单击功能屏蔽F5刷新
2014/03/17 Javascript
js中string转int把String类型转化成int类型
2014/08/13 Javascript
javascript正则表达式之search()用法实例
2015/01/19 Javascript
ES6中的数组扩展方法
2016/08/26 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
jQuery选择器实例应用
2017/01/05 Javascript
如何使用bootstrap框架 bootstrap入门必看!
2017/04/13 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
解决antd Form 表单校验方法无响应的问题
2020/10/27 Javascript
Python中的is和id用法分析
2015/01/26 Python
python绘制圆柱体的方法
2018/07/02 Python
python实现傅里叶级数展开的实现
2018/07/21 Python
python 通过麦克风录音 生成wav文件的方法
2019/01/09 Python
Django模板导入母版继承和自定义返回Html片段过程解析
2019/09/18 Python
详解Python中的分支和循环结构
2020/02/11 Python
如何用Python提取10000份log中的产品信息
2021/01/14 Python
CSS3 实现时间轴动画
2020/11/25 HTML / CSS
html5 offlline 缓存使用示例
2013/06/24 HTML / CSS
abstract class和interface有什么区别?
2012/01/03 面试题
分厂厂长岗位职责
2013/12/29 职场文书
聚美优品恶搞广告词
2014/03/14 职场文书
励志语录:只有自己足够强大,才能不被别人践踏
2020/01/09 职场文书
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android