WWW :: Mechanize :: Timed https тайм-аут не работает

Итак, я исследовал до конца Интернета (по крайней мере, я так думаю) по этой проблеме. Я пытаюсь установить alarm тайм-аут в 60 секунд для get(), но он не улавливается и будет работать более 60 секунд, а также каждый раз, когда достигается тайм-аут по умолчанию (180 секунд) для конструктора www :: Mechanized :: timed , Я получаю сообщение об ошибке ниже:

Использование неинициализированного значения дополнительно (+) в /usr/lib/perl5/site_perl/5.10.0/WWW/Mechanize/Timed.pm, строка 52.

код:

use WWW::Mechanize::Timed;
use HTTP::Cookies;
use Try::Tiny;

my $ua = WWW::Mechanize::Timed->new(
autocheck => 0#turning off autocheck becuase any get errors will be fatal need to check ourselves
);

my $cookies = HTTP::Cookies->new(
autosave => 1
);

$ua->cookie_jar($cookies);

$ua->agent_alias("Windows IE 6");

try{
local $SIG{ALRM} = sub { die "alarm\n" };
alarm 60;
$ua->get('https://secure.site.com'); #secure site that timed out
alarm 0;
} catch {
die $_ unless $_ eq "alarm\n";
print "page timed out after 60 seconds!\n";
exit;
};

my $total_time = sprintf '%.3f', ($ua->client_elapsed_time);

unless($ua->success){
print "Error: " . $ua->status;
exit;
}
...

Я рассмотрел эти вопросы, чтобы понять, как заставить работать будильник без написания собственной функции тайм-аута.

https://stackoverflow.com/questions/5209915/perl-mechanize-timeout-not-working-with-https и Как делать тайм-ауты в Perl?

Пока я вижу рекомендации по использованию LWPx :: ParanoidAgent, но не уверен, понимаю ли я часть «Используйте LWPx :: ParanoidAgent и смешайте его с мехом».

https://stackoverflow.com/questions/11330610/possible-to-use-timeout-in-wwwmechanize-on-https

или исправление LWP :: UserAgent с помощью

http://search.cpan.org/~sharyanto/LWP-UserAgent-Patch-HTTPSHardTimeout-0.04/lib/LWP/UserAgent/Patch/HTTPSHardTimeout.pm

Есть мысли, как заставить тайм-аут работать с будильником?

Спасибо!


person Jude_Quintana    schedule 18.10.2012    source источник
comment
Это могло быть вызвано ошибкой № 57748. Я бы просто использовал Sys :: SigAction с Time :: HiRes для тайм-аута и прошедшего времени.   -  person Sebastian Stumpf    schedule 20.10.2012
comment
Огромное спасибо за указание на эту ошибку. Посмотрев еще немного на Sys :: Sig Action (я не полностью понял это, когда впервые столкнулся с ним), я смог реализовать его, не используя Time :: HiRes для истекшего времени (все еще можно использовать таймеры в WWW :: Механизировать :: Время).   -  person Jude_Quintana    schedule 22.10.2012


Ответы (1)


Приведенное ниже помогло установить будильник для каждого get(). Кажется, намного проще, чем попытаться поймать с помощью sig alarm, если я чего-то не упускаю?

use Sys::SigAction qw(timeout_call);

if ( timeout_call( 60 ,sub { $ua->get('https://secured.site.com'); } ))
   {
print "ALARM page timed out after 60 seconds!\n" ;
exit;
}

Практически тот же ответ, что и на этот вопрос, но с реальным кодом Способы выполнения тайм-аутов в Perl? < / а>

текст из http://metacpan.org/pod/Sys:::SigAction

timeout_call ()

$timeout ,$coderef

Учитывая ссылку на код и значение тайм-аута (в секундах), timeout () (в eval) установит обработчик сигнала для SIGALRM (который умрет), установит будильник и выполнит ссылку на код. $ time (секунды) может быть выражено числом с плавающей запятой.

Если Time :: HiRes присутствует и может использоваться, timeout_call () может использоваться с разрешением таймера 0,000001 секунды. Если Time: HiRes недоступен, то значения фракционной секунды меньше 1.0 прозрачно конвертируются в 1.

Если будильник сработает, код будет прерван. Тревога отменяется, если код возвращается до того, как сработает тревога. Подпрограмма возвращает истину, если время выполнения кода истекло. (был прерван). Исключения, вызванные выполненным кодом, распространяются.

Первоначальный обработчик сигнала восстанавливается перед возвратом вызывающей стороне.

Если HiRes не загружается, Sys :: SigAction сделает все правильно и преобразует

И последнее, что следует учитывать / иметь в виду:

небезопасно использование Sys :: SigAction :: timeout_call?

person Jude_Quintana    schedule 22.10.2012