热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么我这段curl采集,单线程比多线程还快?-php教程

我这里写了个简单的curl采集,但是执行后发现单线程执行的方式比多线程执行要快很多.是我的写法又问题吗?{代码...}这个是单线程的函数:{代码...}又尝试用curl_multi系列函数,但直接看的手册,没完全弄明白:{...
我这里写了个简单的curl采集,但是执行后发现单线程执行的方式比多线程执行要快很多.
是我的写法又问题吗?

$images = [
    "http://pic.91taojin.com.cn/data/attachment/image/20140415/20140415151923_73502.jpg",
    "http://pic.91taojin.com.cn/data/attachment/image/20140415/20140415151826_52170.jpg",
    "http://pic.91taojin.com.cn/data/attachment/image/20140415/20140415152035_59698.jpg",
    "http://pic.91taojin.com.cn/data/attachment/image/20140507/20140507143708_26688.jpg",
    "http://pic.91taojin.com.cn/data/attachment/image/20140417/20140417095153_61993.jpg",
    "http://pic.91taojin.com.cn/data/attachment/image/20140426/20140426094716_96396.jpg",
    "http://pic.91taojin.com.cn/data/attachment/image/20130730/20130730160625_21437.jpg",
    "http://pic.91taojin.com.cn/data/attachment/image/20130731/20130731170502_90104.jpg",
    "http://pic.91taojin.com.cn/data/attachment/image/20130731/20130731165147_80414.jpg",
    "http://pic.91taojin.com.cn/data/attachment/image/20140415/20140415151923_73502.jpg",
];

这个是单线程的函数:

function getImg($url = "", $filename = "")
{
        $ch = curl_init ();
        $opt [CURLOPT_URL] = $url;
        $opt [CURLOPT_HEADER] = true;
        $opt [CURLOPT_CONNECTTIMEOUT] = 10;
        $opt [CURLOPT_TIMEOUT] = 60;
        $opt [CURLOPT_AUTOREFERER] = true;
        $opt [CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11';
        $opt [CURLOPT_RETURNTRANSFER] = true;
        // $opt [CURLOPT_FOLLOWLOCATION] = true; //跟随重定向
        // $opt [CURLOPT_MAXREDIRS] = 10;
        curl_setopt_array ( $ch, $opt );

        $r = curl_exec ( $ch );
        if (false === $r) {
            $errno = curl_errno ( $ch );
            $err = curl_error ( $ch );
            curl_close ( $ch );
            return false;
        }

        // 鉴定一下header:200 才写入文件
        $header = explode("\r\n\r\n", $r);
        if (strpos($header[0], 'HTTP/1.1 200') === 0) {
            file_put_contents($filename, $header[1]);
        }


        curl_close ( $ch );
        return true;
}

又尝试用curl_multi系列函数,但直接看的手册,没完全弄明白:

// 多线程采集数据
function getImgMulti($url=[] , $filename=[]){
    // 创建批处理cURL句柄
    $mh = curl_multi_init();


    // 这里可以加n=10个线程
    foreach ($url as $k => $v ) {
        $ch[$k] = curl_init();

        $opt [CURLOPT_URL] = $v;
        $opt [CURLOPT_HEADER] = true;
        $opt [CURLOPT_CONNECTTIMEOUT] = 10;
        $opt [CURLOPT_TIMEOUT] = 60;
        $opt [CURLOPT_AUTOREFERER] = true;
        $opt [CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11';
        $opt [CURLOPT_RETURNTRANSFER] = true;
        // $opt [CURLOPT_FOLLOWLOCATION] = true; //跟随重定向
        // $opt [CURLOPT_MAXREDIRS] = 10;
        curl_setopt_array ( $ch[$k], $opt );
        // 增加1个句柄
        curl_multi_add_handle($mh,$ch[$k]);
    }





    $running=null;
    // 执行批处理句柄
    do {
        curl_multi_exec($mh,$running);


    } while($running > 0);

    for ($i=0; $i <10; $i++) {
        $r = curl_multi_getcontent($ch[$i]);
        // 鉴定一下header:200 才写入文件
        $header = explode("\r\n\r\n", $r);
        if (strpos($header[0], 'HTTP/1.1 200') === 0) {
            file_put_contents('pics/'.$i.'.jpg', $header[1]);
        }
    }



    // 关闭全部句柄
    // curl_multi_remove_handle($mh, $ch1);
    curl_multi_close($mh);
}

执行结果,循环执行单线程大约1.7秒完成,后面这个3.5秒完成.
可能是我对这个函数的用法没弄透,请哪位来解释下原因?

----后续补充----
我在windows上面测试的,难道说因为win的php多线程有别的问题?
另外还参考了别人写好的php类
http://blog.eiodesign.com/archives/86
用这个类库又做了一遍采集,结果还是一样,更慢了

// 测试库采集
require("libs/class_curl_multi.php");
$mp = new MultiHttpRequest();
//远程图片本地化
$mp->set_urls($images);
$images_result = $mp->start();
foreach ((array)$images_result as $image_key => $image_value) {
    if (!empty($image_key)) {
        _flush("store image:".$image_key."
"); file_put_contents('pics/'.$image_key.'.jpg',$image_value); } }

用时4.05秒

是因为我对这个php的多线程理解有问题,还是其他原因造成这种差距呢? 貌似多线程并没有提高采集效率.反而影响了.

回复内容:

我这里写了个简单的curl采集,但是执行后发现单线程执行的方式比多线程执行要快很多.
是我的写法又问题吗?

$images = [
    "http://pic.91taojin.com.cn/data/attachment/image/20140415/20140415151923_73502.jpg",
    "http://pic.91taojin.com.cn/data/attachment/image/20140415/20140415151826_52170.jpg",
    "http://pic.91taojin.com.cn/data/attachment/image/20140415/20140415152035_59698.jpg",
    "http://pic.91taojin.com.cn/data/attachment/image/20140507/20140507143708_26688.jpg",
    "http://pic.91taojin.com.cn/data/attachment/image/20140417/20140417095153_61993.jpg",
    "http://pic.91taojin.com.cn/data/attachment/image/20140426/20140426094716_96396.jpg",
    "http://pic.91taojin.com.cn/data/attachment/image/20130730/20130730160625_21437.jpg",
    "http://pic.91taojin.com.cn/data/attachment/image/20130731/20130731170502_90104.jpg",
    "http://pic.91taojin.com.cn/data/attachment/image/20130731/20130731165147_80414.jpg",
    "http://pic.91taojin.com.cn/data/attachment/image/20140415/20140415151923_73502.jpg",
];

这个是单线程的函数:

function getImg($url = "", $filename = "")
{
        $ch = curl_init ();
        $opt [CURLOPT_URL] = $url;
        $opt [CURLOPT_HEADER] = true;
        $opt [CURLOPT_CONNECTTIMEOUT] = 10;
        $opt [CURLOPT_TIMEOUT] = 60;
        $opt [CURLOPT_AUTOREFERER] = true;
        $opt [CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11';
        $opt [CURLOPT_RETURNTRANSFER] = true;
        // $opt [CURLOPT_FOLLOWLOCATION] = true; //跟随重定向
        // $opt [CURLOPT_MAXREDIRS] = 10;
        curl_setopt_array ( $ch, $opt );

        $r = curl_exec ( $ch );
        if (false === $r) {
            $errno = curl_errno ( $ch );
            $err = curl_error ( $ch );
            curl_close ( $ch );
            return false;
        }

        // 鉴定一下header:200 才写入文件
        $header = explode("\r\n\r\n", $r);
        if (strpos($header[0], 'HTTP/1.1 200') === 0) {
            file_put_contents($filename, $header[1]);
        }


        curl_close ( $ch );
        return true;
}

又尝试用curl_multi系列函数,但直接看的手册,没完全弄明白:

// 多线程采集数据
function getImgMulti($url=[] , $filename=[]){
    // 创建批处理cURL句柄
    $mh = curl_multi_init();


    // 这里可以加n=10个线程
    foreach ($url as $k => $v ) {
        $ch[$k] = curl_init();

        $opt [CURLOPT_URL] = $v;
        $opt [CURLOPT_HEADER] = true;
        $opt [CURLOPT_CONNECTTIMEOUT] = 10;
        $opt [CURLOPT_TIMEOUT] = 60;
        $opt [CURLOPT_AUTOREFERER] = true;
        $opt [CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11';
        $opt [CURLOPT_RETURNTRANSFER] = true;
        // $opt [CURLOPT_FOLLOWLOCATION] = true; //跟随重定向
        // $opt [CURLOPT_MAXREDIRS] = 10;
        curl_setopt_array ( $ch[$k], $opt );
        // 增加1个句柄
        curl_multi_add_handle($mh,$ch[$k]);
    }





    $running=null;
    // 执行批处理句柄
    do {
        curl_multi_exec($mh,$running);


    } while($running > 0);

    for ($i=0; $i <10; $i++) {
        $r = curl_multi_getcontent($ch[$i]);
        // 鉴定一下header:200 才写入文件
        $header = explode("\r\n\r\n", $r);
        if (strpos($header[0], 'HTTP/1.1 200') === 0) {
            file_put_contents('pics/'.$i.'.jpg', $header[1]);
        }
    }



    // 关闭全部句柄
    // curl_multi_remove_handle($mh, $ch1);
    curl_multi_close($mh);
}

执行结果,循环执行单线程大约1.7秒完成,后面这个3.5秒完成.
可能是我对这个函数的用法没弄透,请哪位来解释下原因?

----后续补充----
我在windows上面测试的,难道说因为win的php多线程有别的问题?
另外还参考了别人写好的php类
http://blog.eiodesign.com/archives/86
用这个类库又做了一遍采集,结果还是一样,更慢了

// 测试库采集
require("libs/class_curl_multi.php");
$mp = new MultiHttpRequest();
//远程图片本地化
$mp->set_urls($images);
$images_result = $mp->start();
foreach ((array)$images_result as $image_key => $image_value) {
    if (!empty($image_key)) {
        _flush("store image:".$image_key."
"); file_put_contents('pics/'.$image_key.'.jpg',$image_value); } }

用时4.05秒

是因为我对这个php的多线程理解有问题,还是其他原因造成这种差距呢? 貌似多线程并没有提高采集效率.反而影响了.

推荐阅读
  • ECMA262规定typeof操作符的返回值和instanceof的使用方法
    本文介绍了ECMA262规定的typeof操作符对不同类型的变量的返回值,以及instanceof操作符的使用方法。同时还提到了在不同浏览器中对正则表达式应用typeof操作符的返回值的差异。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 文章目录简介HTTP请求过程HTTP状态码含义HTTP头部信息Cookie状态管理HTTP请求方式简介HTTP协议(超文本传输协议)是用于从WWW服务 ... [详细]
  • 最近在学Python,看了不少资料、视频,对爬虫比较感兴趣,爬过了网页文字、图片、视频。文字就不说了直接从网页上去根据标签分离出来就好了。图片和视频则需要在获取到相应的链接之后取做下载。以下是图片和视 ... [详细]
  • Scrapy 爬取图片
    1.创建Scrapy项目scrapystartprojectCrawlMeiziTuscrapygenspiderMeiziTuSpiderhttps:movie.douban.c ... [详细]
  • 目录爬虫06scrapy框架1.scrapy概述安装2.基本使用3.全栈数据的爬取4.五大核心组件对象5.适当提升scrapy爬取数据的效率6.请求传参爬虫06scrapy框架1. ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 本文介绍了在Ubuntu下制作deb安装包及离线安装包的方法,通过备份/var/cache/apt/archives文件夹中的安装包,并建立包列表及依赖信息文件,添加本地源,更新源列表,可以在没有网络的情况下更新系统。同时提供了命令示例和资源下载链接。 ... [详细]
  • 使用chrome编辑器实现网页截图功能的方法
    本文介绍了在chrome浏览器中使用编辑器实现网页截图功能的方法。通过在地址栏中输入特定命令,打开控制台并调用命令面板,用户可以方便地进行网页截图操作。 ... [详细]
  • 这个问题发生在重新安装系统后,丢失了之前的privatekey等。所以解决方法就是提示的revokeandrequest。到developercenter中找到certificat ... [详细]
  • 博主使用代理IP来自于网上免费提供高匿IP的这个网站用到的库frombs4importBeautifulSoupimportrandomimporturllib.re ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了正则表达式python相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
张火蓉景荣馨季
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有