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 相关文章推荐
QueryPath PHP 中的jQuery
Apr 11 PHP
php程序效率优化的一些策略小结
Jul 17 PHP
基于PHPExcel的常用方法总结
Jun 13 PHP
PHP-Java-Bridge使用笔记
Sep 22 PHP
php+html5使用FormData对象提交表单及上传图片的方法
Feb 11 PHP
如何通过Linux命令行使用和运行PHP脚本
Jul 29 PHP
php记录搜索引擎爬行记录的实现代码
Mar 02 PHP
tp5实现微信小程序多图片上传到服务器功能
Jul 16 PHP
PHP常用函数之格式化时间操作示例
Oct 21 PHP
thinkphp框架类库扩展操作示例
Nov 26 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
Apr 26 PHP
php去除deprecated的实例方法
Nov 17 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
php smarty模版引擎中的缓存应用
2009/12/02 PHP
php修改时间格式的代码
2011/05/29 PHP
php自动识别文字编码并转换为目标编码的方法
2015/08/08 PHP
php及codeigniter使用session-cookie的方法(详解)
2017/04/06 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
2019/06/14 PHP
你的 mixin 真的兼容 ECMAScript 5 吗?
2013/04/11 Javascript
JS获取地址栏参数的小例子
2013/08/23 Javascript
jquery统计用户选中的复选框的个数
2014/06/06 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
2015/04/12 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
2015/09/12 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
2016/06/17 Javascript
微信小程序 http请求详细介绍
2016/10/09 Javascript
JavaScript中最常用的10种代码简写技巧总结
2017/06/28 Javascript
详解React 16 中的异常处理
2017/07/28 Javascript
微信小程序使用Socket的实例
2017/09/19 Javascript
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
详解如何给React-Router添加路由页面切换时的过渡动画
2019/04/25 Javascript
详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题
2019/11/06 Javascript
Vue父组件向子组件传值以及data和props的区别详解
2020/03/02 Javascript
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
Python多线程编程(四):使用Lock互斥锁
2015/04/05 Python
Python实现的根据IP地址计算子网掩码位数功能示例
2018/05/23 Python
Python enumerate函数遍历数据对象组合过程解析
2019/12/11 Python
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
人力资源专员自我评价怎么写
2013/09/19 职场文书
办公室副主任岗位职责
2013/11/25 职场文书
建材业务员岗位职责
2013/12/08 职场文书
学生会部长竞聘书
2014/03/31 职场文书
教师新年寄语
2014/04/03 职场文书
标准的毕业生自荐信
2014/04/20 职场文书
环境保护标语
2014/06/20 职场文书
事业单位考察材料范文
2014/12/25 职场文书
个人创业事迹材料
2014/12/30 职场文书
赢在执行观后感
2015/06/16 职场文书