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 相关文章推荐
支持oicq头像的留言簿(一)
Oct 09 PHP
简单的过滤字符串中的HTML标记
Dec 25 PHP
require(),include(),require_once()和include_once()区别
Mar 27 PHP
PHP实时显示输出
Oct 02 PHP
页面乱码问题的根源及其分析
Aug 09 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
Mar 17 PHP
PHP中spl_autoload_register()和__autoload()区别分析
May 10 PHP
PHP多维数组转一维数组的简单实现方法
Dec 23 PHP
PHP邮箱验证示例教程
Jun 01 PHP
学习PHP Cookie处理函数
Aug 09 PHP
PHP7下协程的实现方法详解
Dec 17 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
Nov 24 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 字段类型说明
2007/04/27 PHP
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
javascript模块化是什么及其优缺点介绍
2013/09/02 Javascript
JS控制图片等比例缩放的示例代码
2013/12/24 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
2014/11/10 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
2015/08/25 Javascript
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
js实现年月日表单三级联动
2020/04/17 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
JS身份证信息验证正则表达式
2017/06/12 Javascript
Layer弹出层动态获取数据的方法
2018/08/20 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
2018/12/06 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
JS document对象简单用法完整示例
2020/01/14 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
2020/09/10 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
python循环监控远程端口的方法
2015/03/14 Python
Tensorflow卷积神经网络实例进阶
2018/05/24 Python
python之pyqt5通过按钮改变Label的背景颜色方法
2019/06/13 Python
python3连接mysql获取ansible动态inventory脚本
2020/01/19 Python
解决jupyter运行pyqt代码内核重启的问题
2020/04/16 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
解决Keras中CNN输入维度报错问题
2020/06/29 Python
css3实现3D文本悬停改变效果的示例代码
2019/01/16 HTML / CSS
html通过canvas转成base64的方法
2019/07/18 HTML / CSS
越南电子产品购物网站:FPT Shop
2017/12/02 全球购物
小小的船教学反思
2014/02/21 职场文书
乡镇党员干部四风对照检查材料思想汇报
2014/09/27 职场文书
致毕业季:你如何做好自己的职业生涯规划书?
2019/07/01 职场文书
解决Golang time.Parse和time.Format的时区问题
2021/04/29 Golang
MybatisPlus代码生成器的使用方法详解
2021/06/13 Java/Android
Springboot-cli 开发脚手架,权限认证,附demo演示
2022/04/28 Java/Android