我一直在使用Perl的Mechanize库,但出于某种原因使用https的timeout参数(我正在使用Crypt :: SSLeay for SSL)。
my $ browser = WWW :: Mechanize-> new(autocheck => 0,timeout => 3);
之前是否有人遇到此问题并知道如何修复它?谢谢!
答案 0 :(得分:1)
对于HTPS / SSL,您必须采取一些解决方法:
my $html = `wget -q -t 1 -T $timeout -O - $url`;
mech->get(0);
$mech->update_html($html);
答案 1 :(得分:0)
现在只针对https://www.sourceforge.net/进行测试,我得到了超时参数 工作的印象,但直到HTTPS协商发生后它才会起作用。我将超时设置为非常低,为小数值,并且它正确报告超时,但是有一个延迟比我的超时值长得多,然后它会立即返回超时错误。
示例:
#!/usr/bin/perl
use strict;
use warnings;
$|=1;
# This "works", downloading the page within the timeout period
use WWW::Mechanize;
my $mech = WWW::Mechanize->new(
timeout => 3,
);
$mech->get( 'https://www.sourceforge.net/' );
print "Successful get.\n";
# This throws a connect timeout, but after a delay much longer than 50ms
my $mech2 = WWW::Mechanize->new(
timeout => 0.05,
);
$mech2->get( 'https://www.sourceforge.net/' );
print "Successful get 2.\n";
输出:
Successful get.
Error GETing http://sourceforge.net/: Can't connect to sourceforge.net:80
(connect: timeout) at ./throwaway22855.pl line 20
使用select
似乎在IO :: Socket中深入处理超时。在某些系统上,这可能会干扰SIGALRM
,因此如果您想解决此问题并编写自己的超时,请务必阅读平台的实施文档。另请注意(在perldoc perlipc
中)Perl自5.8.x以来一直使用延迟信号,因此如果不使用sigprocmask
解决方法,手动设置闹钟可能无效。
这里有更多信息: SIGALRM Timeout -- How does it affect existing operations?