3

それで、私はこの問題についてインターネットの終わりまで調査しました(少なくとも私はそう思います)。alarmのタイムアウトを60秒に設定しようとしget()ていますが、キャッチされず、60秒を超えて実行されます。また、www :: mechanized :: timedコンストラクターのデフォルトのタイムアウト(180秒)に達すると、以下のエラーが発生します:

/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;
}
...

私はこれらの質問を調べて、独自のタイムアウト関数を作成せずにアラームを機能させる方法を理解しました。

Perl Mechanizeのタイムアウトがhttps で 機能せず、Perlでタイムアウトを実行する方法は?

これまでのところ、LWPx :: ParanoidAgentの使用に関する推奨事項を確認していますが、「LWPx::ParanoidAgentを使用してMechにミックスする」の部分を理解しているかどうかはわかりません。

httpsでWWW::Mechanizeでタイムアウトを使用することは可能ですか?

またはLWP::UserAgentにパッチを適用する

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

タイムアウトをアラームで機能させる方法について何か考えはありますか?

ありがとう!

4

1 に答える 1

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に変換されます。

アラームが鳴ると、コードが中断されます。アラームが発生する前にコードが戻ると、アラームはキャンセルされます。実行中のコードがタイムアウトした場合、ルーチンはtrueを返します。(中断されました)。実行されたコードによってスローされた例外は伝播されます。

呼び出し元に戻る前に、元のシグナルハンドラーが復元されます。

HiResがロード可能でない場合、Sys :: SigActionは正しいことを行い、変換します

最後に考慮すべき/覚えておくべきこと:

Sys :: SigAction :: timeout_callの使用は安全ではありませんか?

于 2012-10-22T17:08:45.910 に答える