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树的代码,可以嵌套任意层
Oct 09 PHP
Ajax PHP 边学边练 之三 数据库
Nov 26 PHP
Laravel 5 框架入门(四)完结篇
Apr 09 PHP
php简单实现发送带附件的邮件
Jun 10 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
Dec 19 PHP
php实现购物车产品删除功能(2)
Jul 23 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
Jul 21 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
PHP生成加减算法方式的验证码实例
Mar 12 PHP
thinkPHP框架RBAC实现原理分析
Feb 01 PHP
Laravel框架实现超简单的分页效果示例
Feb 08 PHP
laravel接管Dingo-api和默认的错误处理方式
Oct 25 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
global.php
2006/12/09 PHP
php中iconv函数使用方法
2008/05/24 PHP
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
帝国cms目录结构分享
2015/07/06 PHP
codeigniter实现get分页的方法
2015/07/10 PHP
php中curl和soap方式请求服务超时问题的解决
2018/06/11 PHP
MooTools 1.2介绍
2009/09/14 Javascript
js控制表单奇偶行样式的简单方法
2013/07/31 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
2015/08/22 Javascript
JS实现鼠标滑过链接改变网页背景颜色的方法
2015/10/20 Javascript
简单实现JavaScript图片切换效果
2016/11/28 Javascript
详解微信小程序设置底部导航栏目方法
2017/06/29 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
Vue2.0系列之过滤器的使用
2018/03/01 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
js实现圆形显示鼠标单击位置
2020/02/11 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
王纯业的Python学习笔记 下载
2007/02/10 Python
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
详解pandas安装若干异常及解决方案总结
2019/01/10 Python
Python之pymysql的使用小结
2019/07/01 Python
如何基于Python创建目录文件夹
2019/12/31 Python
pycharm 关掉syntax检查操作
2020/06/09 Python
python中numpy.empty()函数实例讲解
2021/02/05 Python
pycharm最新激活码有效期至2100年(亲测可用)
2021/02/05 Python
如何使用PHP session
2015/04/21 面试题
函授毕业个人自我评价
2014/02/20 职场文书
初中班主任经验交流材料
2014/05/16 职场文书
民事调解书范文
2015/05/20 职场文书
2015年加油站站长工作总结
2015/05/27 职场文书
毕业生政审意见范文
2015/06/04 职场文书
安全生产培训心得体会
2016/01/18 职场文书