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_Flame(Version:Progress)的原代码
Oct 09 PHP
ip签名探针
Oct 09 PHP
php下防止单引号,双引号在接受页面转义的设置方法
Sep 25 PHP
不用mod_rewrite直接用php实现伪静态化页面代码
Oct 04 PHP
php 获取远程网页内容的函数
Sep 08 PHP
php获取中文拼音首字母类和函数分享
Apr 24 PHP
php简单生成随机数的方法
Jul 30 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
Jul 09 PHP
PHP+jquery+CSS制作头像登录窗(仿QQ登陆)
Oct 20 PHP
PHP 文件上传后端处理实用技巧方法
Jan 06 PHP
php+webSoket实现聊天室示例代码(附源码)
Feb 17 PHP
Thinkphp 5.0实现微信企业付款到零钱
Sep 30 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实现验证码功能
2006/10/09 PHP
php垃圾代码优化操作代码
2010/08/05 PHP
深入理解PHP内核(二)之SAPI探究
2015/11/10 PHP
用Javascript读取中文COOKIE的解决办法
2007/02/15 Javascript
javascript数组的扩展实现代码集合
2008/06/01 Javascript
js 操作css实现代码
2009/06/11 Javascript
jQuery实现图片信息的浮动显示实例代码
2013/08/28 Javascript
判断输入是否为空,获得输入类型的JS代码
2013/10/30 Javascript
Javascript获取当前时间函数和时间操作小结
2014/10/01 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
用Vue.js实现监听属性的变化
2016/11/17 Javascript
基于jQuery实现火焰灯效果导航菜单
2017/01/04 Javascript
elementUI多选框反选的实现代码
2019/04/03 Javascript
基于vue实现滚动条滚动到指定位置对应位置数字进行tween特效
2019/04/18 Javascript
JS如何把字符串转换成json
2020/02/21 Javascript
[01:23]2014DOTA2国际邀请赛 球迷无处不在Ti现场世界杯受关注
2014/07/10 DOTA
动态创建类实例代码
2009/10/07 Python
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
Python正则表达式使用经典实例
2016/06/21 Python
python实现跨excel的工作表sheet之间的复制方法
2018/05/03 Python
Python Logging 日志记录入门学习
2018/06/02 Python
python实现决策树分类
2018/08/30 Python
在Pycharm中将pyinstaller加入External Tools的方法
2019/01/16 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
Django用户认证系统 组与权限解析
2019/08/02 Python
详解css3中 text-fill-color属性
2019/07/08 HTML / CSS
How to spawning asynchronous work in J2EE
2016/08/29 面试题
数控专业推荐信范文
2013/12/02 职场文书
中学生社区服务活动报告
2015/02/05 职场文书
计算机专业自荐信
2015/03/05 职场文书
从严治党主题教育活动总结
2015/05/07 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书
一篇文章带你复习java知识点
2021/06/28 Java/Android
MySQL系列之十三 MySQL的复制
2021/07/02 MySQL
Java数据结构之堆(优先队列)
2022/05/20 Java/Android