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 相关文章推荐
使用apache模块rewrite_module (转)
Feb 14 PHP
php session 错误
May 21 PHP
php5.3 废弃函数小结
May 16 PHP
php实现把url转换迅雷thunder资源下载地址的方法
Nov 07 PHP
PHP如何实现Unicode和Utf-8编码相互转换
Jul 29 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
Aug 12 PHP
关于PHP转换超过2038年日期出错的问题解决
Jun 28 PHP
thinkphp分页集成实例
Jul 24 PHP
php实现的数组转xml案例分析
Sep 28 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 PHP
Laravel框架Eloquent ORM删除数据操作示例
Dec 03 PHP
PHP基于array_unique实现二维数组去重
Jul 14 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
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
2007/03/15 PHP
Laravel框架用户登陆身份验证实现方法详解
2017/09/14 PHP
InnerHtml和InnerText的区别分析
2009/03/13 Javascript
javascript动画浅析
2012/08/30 Javascript
上传的js验证(图片/文件的扩展名)
2013/04/25 Javascript
改变状态栏文字的js代码
2014/06/13 Javascript
9款2014最热门jQuery实用特效推荐
2014/12/07 Javascript
异步JS框架的作用以及实现方法
2015/10/29 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
HTML Table 空白单元格补全的简单实现
2016/10/13 Javascript
JavaScript中最常用的10种代码简写技巧总结
2017/06/28 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
Node.js之readline模块的使用详解
2019/03/25 Javascript
vue19 组建 Vue.extend component、组件模版、动态组件 的实例代码
2019/04/04 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
2020/08/03 Javascript
解决vue与node模版引擎的渲染标记{{}}(双花括号)冲突问题
2020/09/11 Javascript
python中readline判断文件读取结束的方法
2014/11/08 Python
Python中的zip函数使用示例
2015/01/29 Python
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
浅析Python基础-流程控制
2016/03/18 Python
python数据类型_字符串常用操作(详解)
2017/05/30 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/27 Python
Python读写zip压缩文件的方法
2018/08/29 Python
python内存动态分配过程详解
2019/07/15 Python
Python 进程之间共享数据(全局变量)的方法
2019/07/16 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
阿迪达斯印尼官方网站:adidas印尼
2020/02/10 全球购物
大堂副理的岗位职责范文
2014/02/17 职场文书
小学生爱国演讲稿
2014/04/25 职场文书
农村优秀教师事迹材料
2014/08/27 职场文书
2014年度工作总结报告
2014/12/15 职场文书
初三数学教学反思
2016/02/17 职场文书
竞聘开场白方式有哪些?
2019/08/28 职场文书
如何用JS实现简单的数据监听
2021/05/06 Javascript