有没有WWW :: Curl :: Multi的例子?

时间:2009-11-24 22:55:10

标签: perl curl

有人有一个使用WWW::Curl::Multi的工作示例吗?

4 个答案:

答案 0 :(得分:4)

您是否尝试过查看curl homepageCPAN documentation

  

该模块为libcurl提供了一个Perl接口。它不是一个独立的模块,因此,应该在http://curl.haxx.se咨询主要的libcurl文档以获取API详细信息。您正在阅读的文档现在只包含Perl特定的详细信息,一些示例代码以及C API和Perl之间的差异。

但是,主CPAN页面上有WWW::Curl::EasyWWW::Curl::Multi的示例:http://search.cpan.org/perldoc?WWW::Curl#WWW::Curl::Multi

答案 1 :(得分:3)

让您深入了解社区:我从未看到WWW::Curl::Multi正在使用中。绝大多数人使用POE::Component::Client::HTTP(对于ftp和其他有其他客户端)或Parallel::ForkManagerLWP来满足他们的并行http需求。并不是说卷曲不是很好,增加的多网络功能也不好,只是说在实践中其他两个实现很多更常见。

我想承认curl multi对于php社区非常有用,而且我对perl绑定本身并不了解。

答案 2 :(得分:3)

模块的测试套件通常是查找示例的好地方。

答案 3 :(得分:0)

看看Net :: Curl :: Multi,我现在正在试验它。它至少起作用,www版本刚刚崩溃。我使用了libcurl的最新github版本,不得不从Net :: Curl Makefile.pl中删除版本检查。 此示例向服务器发送了一个用于查找的帖子

use Net::Curl::Multi qw(:constants);
use Net::Curl::Easy qw(:constants);
my $start =shift;
my $stop  =shift;
my $usetor=1;
my $outdir = "outtest";
if (! -d $outdir)
{
    mkdir $outdir or die "cannot makedir " . $outdir;
}
my $multi = Net::Curl::Multi->new();

foreach my $id ($start ... $stop)
{
    my $file = $outdir . "/body_$id.html";
    if (
    (!-f $file)     ||
    (-z $file)  
    )
    {

    my $easy = Net::Curl::Easy->new();

    if ($usetor)
    {
        $easy->setopt(CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4); 
        $easy->setopt(CURLOPT_PROXY,"localhost:9050"); #tor
    }


    $easy->setopt(CURLOPT_FOLLOWLOCATION, 1);
    $easy->setopt(CURLOPT_TIMEOUT, 30);
    $easy->setopt(CURLOPT_URL, 'http://www.example.com/searchform');

    $easy->setopt(CURLOPT_CUSTOMREQUEST,"POST" );

    # extract these by looking at the headers
        $easy->setopt(CURLOPT_POSTFIELDS,"ScriptManager=......&__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=&SearchField=${id}&OtherField=&SomeField=&ScrollTop=&__dnnVariable=&__VIEWSTATEENCRYPTED=&ButtonName=Search");

    $easy->setopt(CURLOPT_WRITEFUNCTION, 
              sub { 
              my $self=shift;
              my $data=shift;
              my $len = length($data);
              open BODY, ">>$file" or die "cannot open $file";            
              print BODY $data;
              close BODY;   
              warn "Write called: for $file and $len";
              return $len;
              }     
        );

    $multi->add_handle( $easy );
    }
}

 my $running = 0;
 do {
     my ($r, $w, $e) = $multi->fdset();
     my $timeout = $multi->timeout();
     select $r, $w, $e, $timeout / 1000
         if $timeout > 0;

     $running = $multi->perform();
     while ( my ( $msg, $easy, $result ) = $multi->info_read() ) {
     warn "finished $msg $easy $result";
         $multi->remove_handle( $easy );

         # process $easy
     }
 } while ( $running );