LWP :: UserAgent是否进行任何缓存

时间:2012-10-26 15:48:37

标签: perl lwp lwp-useragent

我正在尝试在Perl中编写监控脚本,该脚本应该检查URL列表。我使用的是LWP::UserAgentHTTP::ResponseTime::HiRes模块。

这是我的代码:

use strict;
use warnings;

use LWP::UserAgent;
use HTTP::Response;
use Time::HiRes qw( gettimeofday );

while (1) {

    my $start = gettimeofday();

    my $ua = LWP::UserAgent->new();
    $ua->agent('lb-healthcheck.pl/0.1');
    $ua->timeout(10);

    # download the tile locally
    my $response = $ua->get("myurl");
    my $content  = $response->content;

    my $end = gettimeofday();

    print "$start - $end = ".(($end-$start)*1000)."\n";
}

在没有while循环的情况下手动运行脚本我平均得到大约70ms的响应时间,但是使用while循环我得到大约5ms的响应时间,这是不真实的。

LWP::UserAgent是否进行任何缓存?如果是,是否可以禁用它以及如何禁用它?如果不是我做错了什么?

4 个答案:

答案 0 :(得分:1)

除非你告诉它,否则

LWP不会对它自己进行任何缓存,但是LWP和主机站点之间有很多。例如,您是通过代理工作吗?如果是这样的话,它将缓存它提取的页面,以防第二次需要它们。云中还有许多其他缓存可能会加快您的响应速度,但7毫秒的时间意味着合理的本地缓存。

您还应该使用tv_interval中的Time::HiRes子例程来计算间隔。它希望您将gettimeofday中的结果对存储在数组中,并计算其中两对之间的差异。您的代码看起来像这样

use Time::HiRes qw( gettimeofday  tv_interval );

while () {

    my $start = [ gettimeofday() ];

    # download the tile locally

    my $end = [ gettimeofday() ];

    print tv_interval($start, $end), "\n";
}

对于它的价值,对于一个普通的国家网站,我获得了大约500毫秒的初始提取,接着大约300毫秒的后续提取。因此,一些缓存正在进行,但影响远远小于您的报告。

答案 1 :(得分:0)

尝试使用设置为删除所有连接的LWP::ConnCache对象设置conn_cache(例如,请参阅其total_capacity子例程)

答案 2 :(得分:0)

看起来您没有正确估算经过的时间。 gettimeof day返回一个包含以下内容的数组:秒和经过的微秒,因此为了计算经过的时间,您需要进行一些转换。类似的东西:

my ($init_sec, $init_usec) = gettimeofday
# SOME CODE HERE
my ($stop_sec, $stop_usec) = gettimeofday

if ( $init_usec > $stop_usec ) {
   $stop_usec += 1_000_000;
   $stop_sec--;
}

#convert seconds into mseconds
my $tsec  = ( $stop_sec  - $init_sec ) * 1_000; 

# convert usecs into msecs
my $tusec = ( $stop_usec - $init_usec) / 1_000;

# elapsed time is $tsec + $tusec

答案 3 :(得分:0)

LWP不进行缓存,但操作系统可能会像DNS查找结果一样缓存数据,因此这些只会在第一次查找和操作系统缓存过期后花费时间。