Frage handle lwp timeout effektiv


Ich verwende LWP, um Inhalt von Webseiten herunterzuladen, und ich möchte die Zeit begrenzen, die es auf eine Seite wartet. Dies wird in lwp wie folgt erreicht:

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

Und das funktioniert gut, außer wenn die Zeitüberschreitung ihr Limit erreicht, es stirbt einfach und ich kann nicht mit dem Skript weitermachen! 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!


7
2018-06-12 02:13


Ursprung


Antworten:


LWP :: Agentist es get() gibt a zurück HTTP :: Antwort Objekt, das Sie zum Überprüfen von Fehlern verwenden können:

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) {
        ...
    }
}

Übrigens ist die bessere Praxis heutzutage zu verwenden Versuchen Sie: Tiny Anstatt von eval {...}. Es gibt dir try {...} catch {...}. und es löst einige Probleme mit der Überprüfung if $@ (Siehe den Hintergrund in der Try::Tiny Dokumentation).


14
2018-06-12 03:14



Sie können das Äquivalent zu einem try {} catch {} in Perl mit eval-Blöcken machen:

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


1
2018-06-12 02:37



Für die meisten Zwecke ist das Zeitlimit von LWP :: UserAgent ausreichend, es hat jedoch einige Nachteile ... es gilt für jeder Systemaufruf, anstatt auf die Summe von ihnen. Wenn Sie wirklich eine feste Zeitüberschreitung benötigen, ist dies eines der Dinge, die LWPx :: ParanoidAgent kümmert sich darum.


1
2018-06-12 03:53