-->

什么是纯Perl语言编写的最简单的方法从另一个HTTP资源流?(What is the easies

2019-08-18 02:34发布

什么是最简单的方法(在不打开壳卷曲,从标准输入读取)在Perl从另一个HTTP资源流? 我在这里假设我从阅读HTTP资源是一个潜在的无限流(或只是真的,真的长)

Answer 1:

HTTP ::精简版的request方法允许你指定一个回调。

$data_callback参数,如果使用的话,是过滤,因为它是接收或处理大量传输数据的方式。 它必须是一个函数引用,并且将被传递:使回调至约要被添加到所述主体数据的当前块的参考,以及对HTTP请求的实例的引用$cbargs参数(其可以是任何东西)。 它必须返回到数据的引用添加到文档,或民主基金的身体。

然而,看着来源, 似乎是在一个错误sub request ,因为它似乎忽视了通过回调。似乎更安全的使用set_callback

#!/usr/bin/perl

use strict;
use warnings;

use HTTP::Lite;

my $http = HTTP::Lite->new;
$http->set_callback(\&process_http_stream);
$http->http11_mode(1);

$http->request('http://www.example.com/');

sub process_http_stream {
    my ($self, $phase, $dataref, $cbargs) = @_;
    warn $phase, "\n";
    return;
}

输出:

C:\Temp> ht
connect
content-length
done-headers
content
content-done
data
done

它看起来像传递给回调request方法区别对待:

#!/usr/bin/perl

use strict;
use warnings;

use HTTP::Lite;

my $http = HTTP::Lite->new;
$http->http11_mode(1);

my $count = 0;
$http->request('http://www.example.com/',
    \&process_http_stream,
    \$count,
);

sub process_http_stream {
    my ($self, $data, $times) = @_;
    ++$$times;
    print "$$times====\n$$data\n===\n";
}


Answer 2:

好老LWP让你处理结果作为流。

例如,这里有一个回调yourFunc,读/传递BYTE_COUNT字节每次调用yourFunc(你可以丢弃PARAM如果你不关心的数据有多大给每个呼叫,只是想尽可能快地处理流):

use LWP;
...
$browser = LWP::UserAgent->new();
$response = $browser->get($url, 
                          ':content_cb' => \&yourFunc, 
                          ':read_size_hint' => byte_count,);
...
sub yourFunc {
   my($data, $response) = @_;
   # do your magic with $data
   # $respose will be a response object created once/if get() returns
}


Answer 3:

等等,我不明白。 你为什么要排除一个单独的进程? 这个:

open my $stream, "-|", "curl $url" or die;
while(<$stream>) { ... }

看起来确实像“最简单的方式”给我。 这肯定比这里的其他建议更容易...



Answer 4:

事件::库会给你一个简单的界面,为您的平台最快的异步IO方法。

IO :: LAMBDA也是相当不错的,用于创建,响应迅捷,IO应用。



文章来源: What is the easiest way in pure Perl to stream from another HTTP resource?