PHP使用CURL_MULTI实现多线程采集的例子

 更新时间:2014年07月29日 10:37:02   投稿:junjie  
这篇文章主要介绍了PHP使用CURL_MULTI实现多线程采集的例子,CURL_MULTI可以对HTTP进行并发访问,需要的朋友可以参考下

这两天有一客户定制了一个免登录发布模块,因为在模块中需要涉及到很多图片下载的问题,考虑到性能问题,所以特别写了一个CURL_MULTI远程采集网页的函数,以方便以后使用,估计以后都不会使用原来的单线程curl函数去foreach了,其性能对比很明显的。同样获取我的博客的十个不同网页,curl_multi:4.5246081352234,file_get_contents:33.001797914505,将近8倍的效率,可想而知,如果在附件更多的情况下,性能差异就越明显了,希望对您有所帮助!

复制代码 代码如下:

<?php
$text = remote(array('https://www.jb51.net/','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;
}

相关文章

  • Discuz!插件:自动隐藏帖子

    Discuz!插件:自动隐藏帖子

    Discuz!插件:自动隐藏帖子...
    2007-03-03
  • php基础教程

    php基础教程

    PHP是全球范围内应用广泛的开发语言,Web开发的最佳语言; PHP和Linux,Apache,MySQL紧密结合,形成LAMP的开源黄金组合,本文给大家php基础教程,php基础,需要的朋友可以参考下
    2015-08-08
  • 在云虚拟主机部署thinkphp5项目的步骤详解

    在云虚拟主机部署thinkphp5项目的步骤详解

    thinkphp官网在去年的时候发布了tp的颠覆版本thinkphp5,tp5确实比之前的版本好用了很多,那么下面这篇文章就来给大家介绍关于在云虚拟主机部署thinkphp5项目的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12
  • PHP添加图片水印、压缩、剪切的封装类

    PHP添加图片水印、压缩、剪切的封装类

    为了防止自己辛苦制作的作品被别人窃取,经常给作品添加水印,以此保证作品的唯一性,那么该怎么给图片添加水印呢,如果作品尺寸过大,该如何处理呢,下面小编给大家详细介绍有关PHP给图片添加水印 压缩 剪切的封装类,需要的朋友可以参考下
    2015-08-08
  • PHP生成自适应大小的缩略图类及使用方法分享

    PHP生成自适应大小的缩略图类及使用方法分享

    PHP生成缩略图网上代码很多,大部分感觉写的太死,而且不能自适应大小。下面放出一个老外的版本
    2014-05-05
  • thinkphp5.1框架模板赋值与变量输出示例

    thinkphp5.1框架模板赋值与变量输出示例

    这篇文章主要介绍了thinkphp5.1框架模板赋值与变量输出,结合实例形式分析了thinkphp5.1框架模板赋值与变量输出基本操作技巧及相关注意事项,需要的朋友可以参考下
    2020-05-05
  • php array_keys 返回数组的键名

    php array_keys 返回数组的键名

    php中array_keys函数用于返回包含数组中所有键名的一个新数组。本文章向大家详细介绍PHP array_keys函数使用方法。需要的码农可以参考一下
    2016-10-10
  • php伪静态之APACHE篇

    php伪静态之APACHE篇

    mod_rewrite是Apache的一个非常强大的功能,它可以实现伪静态页面。下面我详细说说它的使用方法!对初学者很有用的哦!
    2014-06-06
  • PHP大神的十大优良习惯

    PHP大神的十大优良习惯

    这篇文章主要告诉大家PHP大神是如何养成的,php程序员的十大优良习惯,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • PHP正在进行时-变量详解及字符串动态插入变量

    PHP正在进行时-变量详解及字符串动态插入变量

    这篇文章主要介绍了PHP正在进行时-变量详解及字符串动态插入变量的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-12-12

最新评论