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 相关文章推荐
六酷社区论坛HOME页清新格调免费版 下载
Mar 07 PHP
js下函数般调用正则的方法附代码
Jun 22 PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
Dec 05 PHP
PHP strstr 函数判断字符串是否否存在的实例代码
Sep 28 PHP
php后台如何避免用户直接进入方法实例
Oct 15 PHP
php检查字符串中是否包含7位GSM字符的方法
Mar 17 PHP
php实现的用户查询类实例
Jun 18 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
Dec 20 PHP
Centos7 Yum安装PHP7.2流程教程详解
Jul 02 PHP
php操作redis数据库常见方法实例总结
Feb 20 PHP
Thinkphp极验滑动验证码实现步骤解析
Nov 24 PHP
is_file和file_exists效率比较
Mar 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
使用 MySQL 开始 PHP 会话
2006/12/21 PHP
PHP实现的函数重载功能示例
2018/08/03 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
JavaScript 常用函数库详解
2009/10/21 Javascript
jQuery 中使用JSON的实现代码
2011/12/01 Javascript
jquery二级导航内容均分的原理及实现
2013/08/13 Javascript
javascript自动生成包含数字与字符的随机字符串
2015/02/09 Javascript
Js为表单动态添加节点内容的方法
2015/02/10 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
2019/04/30 Javascript
Vue分页效果与购物车功能
2019/12/13 Javascript
[01:34]DOTA2 7.22版本新增神杖效果一览(敏捷英雄篇)
2019/05/28 DOTA
[01:20:47]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第一场 1月19日
2021/03/11 DOTA
python函数装饰器用法实例详解
2015/06/04 Python
python字符类型的一些方法小结
2016/05/16 Python
python爬虫之BeautifulSoup 使用select方法详解
2017/10/23 Python
Python编程实现二分法和牛顿迭代法求平方根代码
2017/12/04 Python
致Python初学者 Anaconda入门使用指南完整版
2018/04/05 Python
python随机数分布random测试
2018/08/27 Python
通过python将大量文件按修改时间分类的方法
2018/10/17 Python
python适合人工智能的理由和优势
2019/06/28 Python
Python生成器常见问题及解决方案
2020/03/21 Python
Python多线程通信queue队列用法实例分析
2020/03/24 Python
Python使用struct处理二进制(pack和unpack用法)
2020/11/12 Python
Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
2016/11/15 全球购物
SheIn俄罗斯:时尚女装网上商店
2017/02/28 全球购物
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
介绍Java的内部类
2012/10/27 面试题
抄袭同学作业检讨书1000字
2014/11/20 职场文书
个人年终总结结尾
2015/03/06 职场文书
工作推荐信模板
2015/03/25 职场文书
2016年端午节校园广播稿
2015/12/18 职场文书
goland 设置project gopath的操作
2021/05/06 Golang
前端监听websocket消息并实时弹出(实例代码)
2021/11/27 Javascript
java项目构建Gradle的使用教程
2022/03/24 Java/Android
Python下载商品数据并连接数据库且保存数据
2022/03/31 Python