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 setTime 设置当前时间的代码
Aug 27 PHP
一个经典实用的PHP图像处理类分享
Nov 18 PHP
php返回相对时间(如:20分钟前,3天前)的方法
Apr 14 PHP
PHP与Ajax相结合实现登录验证小Demo
Mar 16 PHP
php基于jquery的ajax技术传递json数据简单实例
Apr 15 PHP
PHP通过加锁实现并发情况下抢码功能
Aug 10 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
Oct 13 PHP
laravel实现批量更新多条记录的方法示例
Oct 22 PHP
PHP基于GD2函数库实现验证码功能示例
Jan 27 PHP
PHP PDOStatement::fetchAll讲解
Jan 31 PHP
php实现微信公众号创建自定义菜单功能的实例代码
Jun 11 PHP
关于Laravel-admin的基础用法总结和自定义model详解
Oct 08 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
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
php如何解决无法上传大于8M的文件问题
2014/03/10 PHP
使用GD库生成带阴影文字的图片
2015/03/27 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
PHP基于GD2函数库实现验证码功能示例
2019/01/27 PHP
php中Swoole的热更新实现代码实例
2021/03/04 PHP
JS location几个方法小姐
2008/07/09 Javascript
ppk谈JavaScript style属性
2008/10/10 Javascript
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
浅析ajax请求json数据并用js解析(示例分析)
2013/07/13 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
2015/03/24 Javascript
jQuery监控文本框事件并作相应处理的方法
2015/04/16 Javascript
AngularJS 表达式详细讲解及实例代码
2016/07/26 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
2016/12/01 Javascript
老生常谈jacascript DOM节点获取
2017/04/17 Javascript
最常用的jQuery表单验证(简单)
2017/05/23 jQuery
详解mpvue开发小程序小总结
2018/07/25 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
15个顶级开源JavaScript框架和库
2018/10/10 Javascript
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
2020/11/20 Vue.js
python写的ARP攻击代码实例
2014/06/04 Python
理解python正则表达式
2016/01/15 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
Python中一些不为人知的基础技巧总结
2018/05/19 Python
解决pandas .to_excel不覆盖已有sheet的问题
2018/12/10 Python
Pretty Little Thing美国:时尚女性服饰
2018/08/27 全球购物
大学生军训广播稿
2014/01/24 职场文书
超市总经理岗位职责
2014/02/02 职场文书
工作作风建设心得体会
2014/10/22 职场文书
给女朋友道歉的话大全
2015/01/20 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
mysql字符串截取函数小结
2021/04/05 MySQL
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS
Spring Data JPA框架持久化存储数据到数据库
2022/04/28 Java/Android