我一直在使用Perl的機械化庫,但由於某種原因HTTPS超時參數(我使用Crypt :: SSLeay的SSL)。Perl機械化超時不適用於https
my $ browser = WWW :: Mechanize-> new(autocheck => 0,timeout => 3);
有沒有人遇到過這種情況,並知道如何解決它?謝謝!
我一直在使用Perl的機械化庫,但由於某種原因HTTPS超時參數(我使用Crypt :: SSLeay的SSL)。Perl機械化超時不適用於https
my $ browser = WWW :: Mechanize-> new(autocheck => 0,timeout => 3);
有沒有人遇到過這種情況,並知道如何解決它?謝謝!
在剛纔測試它反對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
似乎超時在IO ::插座下方深處處理,使用select
。在某些系統上,這可能會干擾SIGALRM
,所以如果您想要解決此問題並編寫自己的超時時間,請確保您閱讀了平臺的實施文檔。還請注意(在perldoc perlipc
中)自從5.8.x以來Perl已經使用了延遲信號,因此如果不使用sigprocmask
解決方法,手動設置鬧鐘可能無法正常工作。
有一些更多的信息在這裏: SIGALRM Timeout -- How does it affect existing operations?
對於HTPS/SSL你必須做一些變通方法:
my $html = `wget -q -t 1 -T $timeout -O - $url`;
mech->get(0);
$mech->update_html($html);
你有種落後了那裏的第一句話。超時參數會發生什麼? – 2011-03-06 10:24:57
對不起,我打算說超時參數沒有效果。 – 2011-03-06 11:51:10