2012-06-12 18 views
7

Ich benutze LWP, um Inhalt von Webseiten herunterzuladen, und ich möchte die Zeit, die es auf eine Seite wartet, beschränken. Dies wird in lwp wie dies erreicht:Handle LWP Timeout effektiv

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

Und das funktioniert gut, mit Ausnahme, wenn das Timeout erreicht seine Grenze, es ist nur stirbt, und ich kann mit dem Skript nicht weiter auf! Ich würde dieses Zeitlimit wirklich gerne richtig behandeln, damit ich aufzeichnen kann, dass die URL eine Zeitüberschreitung hatte, und dann mit meiner nächsten fortfahren. Weiß jemand, wie man das macht? Vielen Dank!

Antwort

13

LWP::Agent ‚s get() gibt ein HTTP::Response Objekt, das Sie für die Überprüfung Fehler verwenden können:

Btw, die bessere Praxis heutzutage ist Try::Tiny anstelle von eval {...} zu verwenden. Es gibt Ihnen try {...} catch {...}. und es löst einige Probleme mit der Überprüfung if [email protected] (siehe den Hintergrund in der Try::Tiny Dokumentation).

+0

Vielen Dank! Das ist wirklich nützlich. Ich habe es getestet und aus irgendeinem Grund, auch wenn es eine Zeitüberschreitung gibt, kommt es nicht in diese zweite Anweisung. "Lese-Timeout" ist der Inhalt von $ response-> message. Weißt du, warum es für die zweite if-Anweisung nicht als wahr gilt? – srchulo

+0

Ich weiß es nicht genau. Hast du "HTTP :: Status" benutzt? Was sind die tatsächlichen Werte von '$ response-> message' und' $ response-> code'? Ist es eine tatsächliche Zeitüberschreitung (Code 408)? – stevenl

+0

Ich habe den Code genau so verwendet, wie er über "HTTP :: Status :: HTTP_REQUEST_TIMEOUT" ist. $ response-> message enthält "read timeout" und $ response-> code für "500". – srchulo

1

Für die meisten Zwecke ist LWP :: UserAgent Timeout ausreichend, aber es leidet unter einigen Nachteilen ... es gilt für jeder Systemaufruf, anstatt auf das Aggregat von ihnen. Wenn Sie wirklich eine feste Zeitüberschreitung benötigen, ist dies eines der Dinge, die LWPx::ParanoidAgent erledigt.