2

Perl モジュールLWP::Simpleを使用する場合、1 回の getstore() 呼び出しでダウンロードされる速度と量を簡単に判断する方法はありますか? これは、大きなファイルのダウンロードのステータスを監視するのに役立ちます。

私の頭の上から、1つのアプローチは次のとおりです。

  1. 現在の時刻を保存する (time0)
  2. 新しいプロセスで getstore を実行する
  3. 既知の宛先ファイルをポーリングする
    • ダウンロードされた量は、現在のファイル サイズ (サイズ) になります。
    • ダウンロード速度は (size / current_time - time0)

もっと簡単な方法がないか考え中です。

別の提案を歓迎します (おそらく、別のモジュールを使用する必要がありますか?)

4

2 に答える 2

7

を使用する代わりに、 LWP::UserAgentを直接LWP::Simple使用してください。出発点として、LWP::Simple::getstore が $ua を初期化し、リクエストを呼び出す方法を見てください。を呼び出して、必要なことを行うハンドラーを指定する必要があります。デフォルトでは (少なくとも HTTP プロトコルの場合)、最大 4Kb のチャンクを読み取り、チャンクごとにハンドラーを呼び出しますが、リクエスト メソッドのパラメーターで異なるサイズを提案できます。$ua->add_handlerresponse_dataLWP::UserAgentresponse_data

ヘッダー データとファイルに保存される実際のデータを区別したい場合や、リダイレクトがある場合に何か特別なことをしたい場合は、他のハンドラーも指定することをお勧めします。

于 2009-11-22T07:57:51.447 に答える
4

他の要件 (ダウンロード中の速度とサイズの監視など) がない限り、概説した手順が最も簡単に考えて実装できます。

基礎となるユーザー エージェント オブジェクトを LWP::Simple にエクスポートできます。1 回限りのダウンロードだけを見たい場合show_progressは、ユーザー エージェントのビットを設定できます。

 use LWP::Simple qw($ua getstore);

 $ua->show_progress(1);

 getstore( 
'http://www.theperlreview.com/Issues/subscribers.html',
'subscribers.html'
);

より多くの作業を行うには、LWP::Simple を使用して、ysth が提案するのと同じことを行うことができます。

 use LWP::Simple qw($ua);

 $ua->response_header( 
      sub { 
          my($response, $ua, $h) = @_; 
          ... 
          }
      );

そのサブルーチンでは、データを読み取り、タイマーを保持するなど、好きなことを行います。答えが得られたら、そのコードを削除して、元に戻ることができますgetstore

Flavio Poletti は、2009 年春の Perl Review に「LWP のアクティビティの監視」を書き、この手法の多くの使用法を示しています。

于 2009-11-22T22:32:44.853 に答える