perl 设置LWP获取回调的块大小

gv8xihay  于 2023-02-09  发布在  Perl
关注(0)|答案(3)|浏览(164)

LWP::UserAgent模块允许使用回调以块的形式读取Web内容。

$r = $ua->get($url, ':content_cb' => sub
{
  my ($chunk, $resp, $proto) = @_;
  # ...
});

似乎块大小被预设为16384字节,这对我来说非常小。
如何将块设置为不同的大小,比如4MB,即4*1024*1024
我添加了:read_size_hint,如下所示,但没有看到任何效果。

$r = $ua->get($url, ':read_size_hint' => 4*1024*1024, ':content_cb' => sub
{
  my ($chunk, $resp, $proto) = @_;
  # ...
});
lyr7nygr

lyr7nygr1#

:read_size_hint只是给底层套接字模块sysread的一个提示,这并不意味着一次会读取那么多数据,只是在数据已经可用的情况下才有可能读取。
sysread可以返回多少实际可用的数据,这取决于发送方发送数据的速度(sysread不会等待更多时间,而是返回目前可用的数据)以及套接字读取缓冲区的大小。
在TLS的情况下,它还将取决于发送方使用的TLS记录大小,即单个sysread不会返回跨越多个TLS记录的结果。由于TLS中的最大记录大小为16384,因此任何更大的:read_size_hint设置都无效。

2w2cym1i

2w2cym1i2#

恐怕这完全取决于发送服务器的判断。
我所做的是在response_data处理程序中累积它们的响应,直到达到某个标准时才采取进一步的操作。
另一种选择是让对象累积它并使用其他处理程序。

7lrncoxx

7lrncoxx3#

对于固定大小的块:

my $msg_size = 4 * 1024 * 1024;
my $buf = '';

my $response = $ua->get( $url, 
   ':content_cb' => sub {
      $buf .= shift;
      while ( length( $buf ) >= $msg_size ) {
         process( substr( $buf, 0, $msg_size, "" ), @_ );
      }
   },
);

!length( $buf )
   or die( "Premature EOF\n" );

相关问题