我正在使用LWP从网页下载内容,我想限制等待页面的时间.
my $ua = LWP::UserAgent->new; $ua->timeout(10); $ua->env_proxy; $response = $ua->get("http://XML File"); $content = $response->decoded_content;
问题是服务器偶尔会死锁(我们试图找出原因)并且请求永远不会成功.由于服务器认为它是活动的,它会使套接字连接保持打开状态,因此LWP :: UserAgent的超时值对我们来说没有任何好处.对请求强制执行绝对超时的最佳方法是什么?
每当超时达到极限时,它就会死掉,我无法继续使用脚本!
整个脚本处于循环中,它必须按顺序获取XML文件.
我真的很想妥善处理这个超时并使脚本继续下一个地址.有谁知道如何做到这一点?谢谢!!
解决方法
我在
https://stackoverflow.com/a/10318268/1331451之前遇到过类似的问题.
你需要做的是添加一个$SIG {ALRM}处理程序并使用alarm
来调用它.您可以在拨打电话之前设置闹钟,然后直接取消闹钟.然后你可以看看你回来的HTTP :: Result.
警报将触发信号,Perl将调用信号处理程序.在它里面,你既可以直接做东西也可以死去或者死去.评估是为了让模具不破坏整个程序.如果调用信号处理程序,则会自动重置警报.
你也可以给处理程序添加不同的骰子消息,然后在@答案中说@lars之类的$@来区分.
这是一个例子:
my $ua = LWP::UserAgent->new; my $req = HTTP::Request->new; my $res; eval { # custom timeout (strace shows EAGAIN) # see https://stackoverflow.com/a/10318268/1331451 local $SIG{ALRM} = sub { # This is where it dies die "Timeout occured..."; }; # NB: \n required alarm 10; $res = $ua->request($req); alarm 0; }; if ($res && $res->is_success) { # the result was a success }
> perlipc为信号.