有人有一个使用WWW::Curl::Multi的工作示例吗?
答案 0 :(得分:4)
您是否尝试过查看curl homepage? CPAN documentation说
该模块为libcurl提供了一个Perl接口。它不是一个独立的模块,因此,应该在http://curl.haxx.se咨询主要的libcurl文档以获取API详细信息。您正在阅读的文档现在只包含Perl特定的详细信息,一些示例代码以及C API和Perl之间的差异。
但是,主CPAN页面上有WWW::Curl::Easy
和WWW::Curl::Multi
的示例:http://search.cpan.org/perldoc?WWW::Curl#WWW::Curl::Multi
答案 1 :(得分:3)
让您深入了解社区:我从未看到WWW::Curl::Multi
正在使用中。绝大多数人使用POE::Component::Client::HTTP
(对于ftp和其他有其他客户端)或Parallel::ForkManager
和LWP
来满足他们的并行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 );