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中文件缓存转内存缓存的方法
Dec 06 PHP
PHP可变函数的使用详解
Jun 14 PHP
php sybase_fetch_array使用方法
Apr 15 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
Jul 24 PHP
Smarty变量调节器失效的解决办法
Aug 20 PHP
php判断文件上传类型及过滤不安全数据的方法
Dec 17 PHP
phplot生成图片类用法详解
Jan 06 PHP
php算法实例分享
Jul 14 PHP
PHP实现查询两个数组中不同元素的方法
Feb 23 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
May 20 PHP
CentOS 上搭建 PHP7 开发测试环境
Feb 26 PHP
php语言注释,单行注释和多行注释
Jan 21 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
PHP3 safe_mode 失效漏洞
2006/10/09 PHP
用PHP连接MySQL代码的参数说明
2008/06/07 PHP
php $_SERVER当前完整url的写法
2009/11/12 PHP
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
Laravel 5框架学习之Laravel入门和新建项目
2015/04/07 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
PHP中的use关键字及文件的加载详解
2016/11/28 PHP
Zend Framework分发器用法示例
2016/12/11 PHP
用js实现计算代码行数的简单方法附代码
2007/08/13 Javascript
jQuery Selector选择器小结
2010/05/06 Javascript
JQuery里面的几种选择器 查找满足条件的元素$(&quot;#控件ID&quot;)
2011/08/23 Javascript
JavaScript判断DOM何时加载完毕的技巧
2012/11/11 Javascript
表格奇偶行设置不同颜色的核心JS代码
2013/12/24 Javascript
自定义百度分享的分享按钮
2015/03/18 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
vue的Virtual Dom实现snabbdom解密
2017/05/03 Javascript
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
js+SVG实现动态时钟效果
2018/07/14 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
详解Howler.js Web音频播放终极解决方案
2020/08/23 Javascript
python模块简介之有序字典(OrderedDict)
2016/12/01 Python
Python使用enumerate获取迭代元素下标
2020/02/03 Python
Spring @Enable模块驱动原理及使用实例
2020/06/23 Python
3分钟看懂Python后端必须知道的Django的信号机制
2020/07/26 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
使用Python爬虫爬取小红书完完整整的全过程
2021/01/19 Python
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
html5中地理位置定位api接口开发应用小结
2013/01/04 HTML / CSS
乌克兰的第一家手表店:Deka
2020/03/05 全球购物
介绍一下Python下range()函数的用法
2013/11/07 面试题
球队口号
2014/06/18 职场文书
实习生个人总结范文
2015/02/28 职场文书
讲座新闻稿
2015/07/18 职场文书
经典爱情感言
2015/08/03 职场文书
JS新手入门数组处理的实用方法汇总
2021/04/07 Javascript