lwpでtimeoutを設定する
web系のスクリプトでよく使っているLWP::UserAgentで、timeoutの設定がうまくいったりいかなかったり。
lwpではtimeoutを指定できるはず。
「LWP::UserAgent - Web ユーザエージェントクラス」
https://perldoc.jp/docs/modules/libwww-perl-6.04/LWP/UserAgent.pod
timeout( $sec) 秒単位のタイムアウト値を取得または設定します。 デフォルトのtimeout()の値は180秒、つまり3分です。 サーバへの接続においてtimeout秒反応がないと、リクエストは中断します。 つまり、トランザクションが完了してrequest()メソッドが実際に返るまでの 時間を意味します。
だけど、相手サーバーの反応がない(HTTPのresponse 500番台)場合に、このtimeout判定がうまくいかない、ような気がする。
このあたりを調べた時のブログエントリ
「LWPでtimeout指定が効かない::ひまつぶし雑記帖」
lwpのtimeoutを使わずにSIGNALで捕捉するようにして、いま使ってるのが以下のルーチン
my $res;
eval{
local $SIG{ALRM} = sub{die "timeout";};
alarm $self->{timeout};
$res = $ua->request($req);
alarm 0;
};
alarm 0;
if( $@ ){
printf qq{ERROR post_actpb %s ::: %s}, $url, $@;
}
return $res;
SIGNALのALRMを設定してevalで捕捉。
- evalでくるんでALRMを設定。
- スクリプトで設定したtimeout秒待って反応がなかったらdie、evalでエラー捕捉となる。
- 「$@」でエラー表示。
以上で、意図通りにtimeoutを捕捉できる。
「alarm 0」(ALRMのリセット)が2箇所にあるのは
ALRMで監視時間以内(evalの中)で「成功」していたら、ALRMがリセットされないので、evalを抜けた後にも「alarm 0」(ALRMのリセット)が必要。
[2026-01-07 09:02:12] v1.0.0

