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 Notice: Undefined index 错误提示解决方法
Aug 29 PHP
PHP对MongoDB[NoSQL]数据库的操作
Mar 01 PHP
php读取excel文件示例分享(更新修改excel)
Feb 27 PHP
PHP实现抓取HTTPS内容
Dec 01 PHP
ThinkPHP 404页面的设置方法
Jan 14 PHP
php随机显示指定文件夹下图片的方法
Jul 13 PHP
php通过排列组合实现1到9数字相加都等于20的方法
Aug 03 PHP
PHP+JQuery+Ajax实现分页方法详解
Aug 06 PHP
php字符串操作常见问题小结
Oct 11 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
Nov 08 PHP
Laravel框架定时任务2种实现方式示例
Dec 08 PHP
详解使用php-cs-fixer格式化代码
Sep 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
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
2009/09/05 PHP
利用腾讯的ip地址库做ip物理地址定位
2010/07/24 Javascript
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
javascript学习笔记(九)javascript中的原型(prototype)及原型链的继承方式
2011/04/12 Javascript
jquery插件NProgress.js制作网页加载进度条
2015/06/05 Javascript
Easyui form combobox省市区三级联动
2016/01/13 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
2016/11/20 Javascript
js 去掉字符串前后空格实现代码集合
2017/03/25 Javascript
nodejs判断文件、文件夹是否存在及删除的方法
2017/11/10 NodeJs
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
vue init webpack 建vue项目报错的解决方法
2018/09/29 Javascript
vue-cli中安装方法(图文详细步骤)
2018/12/12 Javascript
ES6的异步终极解决方案分享
2019/07/11 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
微信小程序实现签字功能
2019/12/23 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
[00:10]神之谴戒
2019/03/06 DOTA
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
Python网络编程详解
2017/10/31 Python
python随机取list中的元素方法
2018/04/08 Python
python3中的md5加密实例
2018/05/29 Python
Python3 使用cookiejar管理cookie的方法
2018/12/28 Python
Python制作动态字符图的实例
2019/01/27 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
Python按照list dict key进行排序过程解析
2020/04/04 Python
pygame实现弹球游戏
2020/04/14 Python
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
初级会计求职信范文
2014/02/15 职场文书
《鸟的天堂》教学反思
2014/02/27 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
党课主持词大全
2015/06/30 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL
帮你提高开发效率的JavaScript20个技巧
2021/06/18 Javascript