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
php设计模式 Command(命令模式)
Jun 26 PHP
PHP使用正则表达式清除超链接文本
Nov 12 PHP
php 魔术方法详解
Nov 11 PHP
php中文验证码实现方法
Jun 18 PHP
php自动更新版权信息显示的方法
Jun 19 PHP
thinkPHP交易详情查询功能详解
Dec 02 PHP
PHP实现的下载远程文件类定义与用法示例
Jul 05 PHP
php简单读取.vcf格式文件的方法示例
Sep 02 PHP
PHP实现链式操作的三种方法详解
Nov 16 PHP
Yii2框架加载css和js文件的方法分析
May 25 PHP
laravel添加角色和模糊搜索功能的实现代码
Jun 22 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 set_magic_quotes_runtime() 函数过时解决方法
2010/07/08 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
PHP会话操作之cookie用法分析
2016/09/28 PHP
PHP的消息通信机制测试实例
2016/11/10 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
2018/05/28 PHP
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
2010/03/21 Javascript
javascript函数特点实例分析
2015/05/14 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
jquery validate demo 基础
2015/10/29 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
8 行 Node.js 代码实现代理服务器
2016/12/05 Javascript
详解React 在服务端渲染的实现
2017/11/16 Javascript
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
vue实现表单录入小案例
2019/09/27 Javascript
微信小程序背景音乐开发详解
2019/12/12 Javascript
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
[01:00:35]2018DOTA2亚洲邀请赛3月30日B组 EffcetVSMineski
2018/03/31 DOTA
[01:02:55]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python时间获取及转换知识汇总
2017/01/11 Python
python3中int(整型)的使用教程
2017/03/23 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
2017/07/13 Python
详解使用Python下载文件的几种方法
2019/10/13 Python
检测tensorflow是否使用gpu进行计算的方式
2020/02/03 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
Vilebrequin美国官方网上商店:法国豪华泳装品牌
2020/02/22 全球购物
《灯光》教学反思
2014/02/08 职场文书
充分就业社区汇报材料
2014/05/07 职场文书
小学生环保倡议书
2014/05/15 职场文书
政风行风整改方案
2014/10/25 职场文书
2014年度思想工作总结
2014/11/27 职场文书
谁动了我的奶酪读书笔记
2015/06/30 职场文书
golang 实用库gotable的具体使用
2021/07/01 Golang
Go gorilla securecookie库的安装使用详解
2022/08/14 Golang
Java Redisson多策略注解限流
2022/09/23 Java/Android