2012-06-12 47 views
7

Tôi đang sử dụng LWP để tải xuống nội dung từ các trang web và tôi muốn giới hạn khoảng thời gian chờ trang. Điều này được thực hiện trong lwp như thế này:xử lý hết thời gian chờ lwp

my $ua = LWP::UserAgent->new; 
$ua->timeout(10); 
$ua->get($url); 

Và điều này làm việc tốt, ngoại trừ bất cứ khi nào hết thời gian, nó chỉ chết và tôi không thể tiếp tục với kịch bản! Tôi thực sự muốn xử lý thời gian chờ này đúng cách để tôi có thể ghi lại rằng url đã hết thời gian chờ và sau đó chuyển sang lần tiếp theo. Có ai biết cách để làm điều này không? Cảm ơn!

Trả lời

13

LWP::Agent 's get() trả về một đối tượng HTTP::Response mà bạn có thể sử dụng cho các lỗi kiểm tra:

use LWP::Agent; 
use HTTP::Status(); 

my $ua = LWP::UserAgent->new; 
$ua->timeout(10); 
my $response = $ua->get($url); 

if ($response->is_error) { 
    printf "[%d] %s\n", $response->code, $response->message; 

    # record the timeout 
    if ($response->code == HTTP::Status::HTTP_REQUEST_TIMEOUT) { 
     ... 
    } 
} 

Btw, thực tiễn tốt hơn hiện nay là sử dụng Try::Tiny thay vì eval {...}. Nó cung cấp cho bạn try {...} catch {...}. và nó giải quyết một số vấn đề với việc kiểm tra if [email protected] (xem phần nền trong tài liệu Try::Tiny).

+0

Cảm ơn rất nhiều! Điều này thực sự hữu ích. Tôi đã thử nghiệm nó mặc dù và vì một số lý do ngay cả khi có một thời gian chờ nó không nhận được bên trong thứ hai nếu tuyên bố. "read timeout" là nội dung bên trong thông điệp $ response->. Bạn có biết tại sao nó không kiểm tra đúng cho câu lệnh if thứ hai không? – srchulo

+0

Không biết chắc chắn. Bạn đã sử dụng HTTP :: Status' chưa? Giá trị thực của '$ response-> message' và' $ response-> code' là gì? Đây có phải là thời gian chờ thực sự (mã 408) không? – stevenl

+0

Tôi đã sử dụng mã chính xác như trên "HTTP :: Status :: HTTP_REQUEST_TIMEOUT". $ response-> message giữ "read timeout" và $ response-> code giữ "500". – srchulo

1

Bạn có thể làm tương đương với một try {} catch {} trong Perl sử dụng khối eval:

http://perldoc.perl.org/functions/eval.html

+0

Cảm ơn. Không thanh lịch như những gì tôi đã hy vọng, nhưng đó là những gì tôi đã kết thúc bằng cách sử dụng. – srchulo

1

Đối với hầu hết các mục đích, LWP :: Thời gian chờ của UserAgent là đủ, nhưng nó có một số hạn chế ... nó áp dụng cho mỗi cuộc gọi hệ thống, thay vì tổng hợp chúng. Nếu bạn thực sự cần một khoảng thời gian chờ cố định, đây là một trong những điều mà LWPx::ParanoidAgent chăm sóc.

Các vấn đề liên quan