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 16 PHP
php中全局变量global的使用演示代码
May 18 PHP
ThinkPHP与PHPExcel冲突解决方法
Aug 08 PHP
linux iconv方法的使用
Oct 01 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
Sep 06 PHP
PHP文件操作方法汇总
Jul 01 PHP
百度地图API使用方法详解
Aug 25 PHP
php实现word转html的方法
Jan 22 PHP
示例详解Laravel重置密码代码重构
Aug 10 PHP
老生常谈PHP位运算的用途
Mar 12 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
May 17 PHP
PHP封装的mysqli数据库操作类示例
Feb 16 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
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
php下将XML转换为数组
2010/01/01 PHP
PHP mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
PHP中实现生成静态文件的方法缓解服务器压力
2014/01/07 PHP
php数组查找函数总结
2014/11/18 PHP
php获取QQ头像并显示的方法
2014/12/23 PHP
用js遍历 table的脚本
2008/07/23 Javascript
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
Javascript学习笔记 delete运算符
2011/09/13 Javascript
浅析jQuery中常用的元素查找方法总结
2013/07/04 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
总结JavaScript中布尔操作符||与&amp;&amp;的使用技巧
2015/11/17 Javascript
javascript实现九宫格相加数值相等
2020/05/28 Javascript
js实现文字滚动效果
2016/03/03 Javascript
vue获取dom元素注意事项
2017/12/28 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
[55:45]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第一局
2016/02/28 DOTA
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
Python httplib,smtplib使用方法
2008/09/06 Python
Python运行不显示DOS窗口的解决方法
2018/10/22 Python
python判断列表的连续数字范围并分块的方法
2018/11/16 Python
python3使用腾讯企业邮箱发送邮件的实例
2019/06/28 Python
django 基于中间件实现限制ip频繁访问过程详解
2019/07/30 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
详解Python 函数参数的拆解
2020/09/02 Python
python安装第三方库如xlrd的方法
2020/10/31 Python
CSS3中的弹性布局em运用入门详解 1em等于多少像素
2021/02/08 HTML / CSS
美国指甲油品牌:Deco Miami
2017/01/30 全球购物
什么是servlet链?
2014/07/13 面试题
秘书行业自我鉴定范文
2013/12/30 职场文书
公司周年庆典邀请函
2014/01/12 职场文书
2014年结对帮扶工作总结
2014/12/17 职场文书
您对思维方式了解多少?
2019/12/09 职场文书
基于CSS3画一个iPhone
2021/04/21 HTML / CSS
div与span之间的区别与使用介绍
2021/12/06 HTML / CSS
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
2022/04/11 PHP