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代码
Aug 08 PHP
PHP中改变图片的尺寸大小的代码
Jul 17 PHP
php中获取远程客户端的真实ip地址的方法
Aug 03 PHP
PHP实现时间轴函数代码
Oct 08 PHP
解析thinkphp中的M()与D()方法的区别
Jun 22 PHP
解析在PHP中使用全局变量的几种方法
Jun 24 PHP
PHP 字符串长度判断效率更高的方法
Mar 02 PHP
PDO预处理语句PDOStatement对象使用总结
Nov 20 PHP
symfony表单与页面实现技巧
Jan 26 PHP
4种PHP异步执行的常用方式
Dec 24 PHP
PHP实现权限管理功能示例
Sep 22 PHP
thinkPHP5框架分页样式类完整示例
Sep 01 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
《逃离塔科夫》——“萌新劝退,老手自嗨”的硬核FPS游戏
2020/04/03 其他游戏
drupal 代码实现URL重写
2011/05/04 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
php实现生成验证码实例分享
2016/04/10 PHP
PHP实现递归目录的5种方法
2016/10/27 PHP
Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作
2017/06/30 PHP
JavaScript经典效果集锦
2010/07/06 Javascript
防止jQuery ajax Load使用缓存的方法小结
2014/02/22 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
浅谈javascript面向对象程序设计
2015/01/21 Javascript
详解JavaScript中基于原型prototype的继承特性
2016/05/05 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
微信小程序“摇一摇”的实例代码
2017/07/20 Javascript
node.js学习之断言assert的使用示例
2017/09/28 Javascript
vue 使用vue-i18n做全局中英文切换的方法
2018/10/29 Javascript
JavaScript学习笔记之DOM操作实例分析
2019/01/08 Javascript
js实现多个倒计时并行 js拼团倒计时
2019/02/25 Javascript
seajs和requirejs模块化简单案例分析
2019/08/26 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
Ant Design的可编辑Tree的实现操作
2020/10/31 Javascript
如何在JavaScript中正确处理变量
2020/12/25 Javascript
从源码角度来回答keep-alive组件的缓存原理
2021/01/18 Javascript
Python translator使用实例
2008/09/06 Python
python定时采集摄像头图像上传ftp服务器功能实现
2013/12/23 Python
使用python的chardet库获得文件编码并修改编码
2014/01/22 Python
Python多线程实现同步的四种方式
2017/05/02 Python
Python tornado队列示例-一个并发web爬虫代码分享
2018/01/09 Python
基于python list对象中嵌套元组使用sort时的排序方法
2018/04/18 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
牵手50台湾:专为黄金岁月的单身人士而设的交友网站
2021/02/18 全球购物
extern是什么意思
2016/03/10 面试题
物业管理专业求职信
2014/06/11 职场文书
Python实现视频中添加音频工具详解
2021/12/06 Python
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers