2009-11-22 5 views
2

perl 모듈 LWP::Simple을 사용할 때 단일 getstore() 호출로 다운로드 한 속도와 양을 확인하는 간단한 방법이 있습니까? 이것은 대용량 파일 다운로드의 상태를 관찰 할 때 유용합니다. 내 머리 위로 떨어져 LWP :: Simple의 getstore()에서 다운로드 속도와 양을 어떻게 확인할 수 있습니까?

는 한 가지 방법이 될 것이다에 :

  1. 저장 현재 시간 (time0) 새로운 프로세스에
  2. 실행으로 getStore
  3. 여론 조사 알려진 대상 파일
    • 다운로드 한 파일의 크기는 현재 파일 크기 (크기)
    • 입니다. 다운로드 속도는 (크기/현재 시간 - 시간 0)
    • 012입니다.

더 간단한 방법이 있는지 궁금합니다.

대안 제안 (아마도 내가 다른 모듈을 사용해야합니까?) 환영

답변

4

다운로드하는 동안 속도와 크기를 보는 것과 같은 다른 요구 사항이 없다면 생각한 단계를 생각하고 구현하는 것이 가장 쉽습니다.

LWP :: Simple에서 기본 사용자 에이전트 객체를 내보낼 수 있습니다. 당신은 단지 일회성의 다운로드를보고 싶은 경우, 사용자 에이전트의 show_progress 비트 설정할 수 있습니다

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

$ua->show_progress(1); 

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

더 많은 일을하기를, 당신은 간단한 :: LWP를 사용하고 여전히 same thing ysth suggests을 수행 할 수 있습니다 :

use LWP::Simple qw($ua); 

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

해당 서브 루틴에서는 데이터를 읽고 원하는대로 타이머를 유지합니다. 대답을 얻으면 해당 코드를 삭제하고 getstore으로 돌아갈 수 있습니다.

Flavio Poletti는 The Perl Review, Spring 2009에 대한 "LWP의 활동 감상"을 작성했으며이 기술의 많은 용도를 보여줍니다.

+0

훌륭한 응답과 예를 보내 주셔서 감사합니다. Flavio Poletti의 한 쪽 글 쓰기도 유용하고 간결했습니다. – vlee

+0

Flavio의 한 페이지 쓰기가 간결하다는 것을 발견하지 못했습니다. 또한,이 대답은 나를 도왔다. 다운로드해야하는 매우 큰 파일이 있고 다운로드하는 동안 Named Pipe를 사용하여 GUI (Objective C로 작성)에 메시지를 게시해야합니다.파이프를 가지고 있지만 아직 다운로드 할 때 LWP 바이트 이터레이터를 알아 내지 못합니다. – Volomike

7

을 대신 LWP::Simple를 사용하는 직접 LWP::UserAgent를 사용합니다. 시작 지점에서 LWP :: Simple :: getstore가 $ ua를 초기화하고 요청을 호출하는 방법을 살펴보십시오. 으로 전화하여 response_data 처리기를 지정하여 원하는대로 처리 할 수 ​​있습니다. 기본적으로 (적어도 HTTP 프로토콜의 경우) LWP::UserAgent은 최대 4KB 청크를 읽고 각 청크에 대해 response_data 처리기를 호출하지만 요청 메소드 매개 변수에서 다른 크기를 제안 할 수 있습니다.

헤더 데이터와 파일에 저장 될 실제 데이터를 구별하거나 리디렉션이있을 경우 특별한 작업을 수행하려는 경우 다른 핸들러를 지정할 수도 있습니다.

+0

감사합니다. 나는 더 좋은 방법이 있어야한다는 것을 알았다. – vlee