PHP使用CURL_MULTI实现多线程采集的例子


Posted in PHP onJuly 29, 2014

这两天有一客户定制了一个免登录发布模块,因为在模块中需要涉及到很多图片下载的问题,考虑到性能问题,所以特别写了一个CURL_MULTI远程采集网页的函数,以方便以后使用,估计以后都不会使用原来的单线程curl函数去foreach了,其性能对比很明显的。同样获取我的博客的十个不同网页,curl_multi:4.5246081352234,file_get_contents:33.001797914505,将近8倍的效率,可想而知,如果在附件更多的情况下,性能差异就越明显了,希望对您有所帮助!

<?php

$text = remote(array('https://3water.com/','http://www.baidu.com/'));

print_r($text);
function remote($urls) {

    if (!is_array($urls) or count($urls) == 0) {

        return false;

    }
    $curl = $text = array();

    $handle = curl_multi_init();

    foreach($urls as $k => $v) {

        $nurl[$k]= preg_replace('~([^:\/\.]+)~ei', "rawurlencode('\\1')", $v);

        $curl[$k] = curl_init($nurl[$k]);

        curl_setopt($curl[$k], CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($curl[$k], CURLOPT_HEADER, 0);

        curl_multi_add_handle ($handle, $curl[$k]);

    }
    $active = null;

    do {

        $mrc = curl_multi_exec($handle, $active);

    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    while ($active && $mrc == CURLM_OK) {

        if (curl_multi_select($handle) != -1) {

            do {

                $mrc = curl_multi_exec($handle, $active);

            } while ($mrc == CURLM_CALL_MULTI_PERFORM);

        }

    }
    foreach ($curl as $k => $v) {

        if (curl_error($curl[$k]) == "") {

        $text[$k] = (string) curl_multi_getcontent($curl[$k]);

        }

        curl_multi_remove_handle($handle, $curl[$k]);

        curl_close($curl[$k]);

    }

    curl_multi_close($handle);

    return $text;

}
PHP 相关文章推荐
自动生成文章摘要的代码[PHP 版本]
Mar 20 PHP
PHP Google的translate API代码
Dec 10 PHP
用php实现让页面只能被百度gogole蜘蛛访问的方法
Dec 29 PHP
php预定义变量使用帮助(带实例)
Oct 30 PHP
PHP登录环节防止sql注入的方法浅析
Jun 30 PHP
thinkphp数据查询和遍历数组实例
Nov 28 PHP
php实现的双色球算法示例
Jun 20 PHP
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
May 12 PHP
PHP5.6.8连接SQL Server 2008 R2数据库常用技巧分析总结
May 06 PHP
PHP 实现文件压缩解压操作的方法
Jun 14 PHP
php时间戳转换代码详解
Aug 04 PHP
在laravel中实现ORM模型使用第二个数据库设置
Oct 24 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
PHP exif扩展方法开启详解
Jul 28 #PHP
You might like
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
深入PHP curl参数的详解
2013/06/17 PHP
如何简单地用YUI做JavaScript动画
2007/03/10 Javascript
js 优化次数过多的循环 考虑到性能问题
2011/03/05 Javascript
JQuery 常用方法和事件详细介绍
2013/04/18 Javascript
jquery iframe操作详细解析
2013/11/20 Javascript
js导出txt示例代码
2014/01/14 Javascript
禁用JavaScript控制台调试的方法
2014/03/07 Javascript
js对字符的验证方法汇总
2015/02/04 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
详解微信小程序网络请求接口封装实例
2019/05/02 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
实用的Vue开发技巧
2019/05/30 Javascript
layui select 禁止点击的实现方法
2019/09/05 Javascript
vue实现前端列表多条件筛选
2020/10/26 Javascript
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
在Linux下调试Python代码的各种方法
2015/04/17 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
Python内置random模块生成随机数的方法
2019/05/31 Python
python3.6编写的单元测试示例
2019/08/17 Python
python获得命令行输入的参数的两种方式
2020/11/02 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
世界上最好的威士忌和烈性酒购买网站:The Whisky Exchange
2016/11/20 全球购物
美国最大的农村生活方式零售店:Tractor Supply Company(TSC)
2017/05/15 全球购物
瑞典度假品牌:OAS
2019/05/28 全球购物
搬家公司的创业计划书
2014/01/01 职场文书
上班玩手机检讨书
2014/02/17 职场文书
五年后的职业生涯规划
2014/03/04 职场文书
护理专科学生自荐书
2014/07/05 职场文书
机关驾驶员违规检讨书
2014/09/13 职场文书
店铺转让协议书
2015/01/29 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书
css中z-index: 0和z-index: auto的区别
2021/08/23 HTML / CSS
JavaScript异步操作中串行和并行
2021/11/20 Javascript
pytorch实现加载保存查看checkpoint文件
2022/07/15 Python