2009-11-22 45 views
2

使用perl模塊LWP::Simple時,是否有一種簡單的方法來確定單個getstore()調用下載的速度和數量?這對於觀察大文件下載的狀態很有用。如何從LWP :: Simple的getstore()中確定下載速度和金額?

關閉我的頭頂,一個辦法是:

  1. 店當前時間(時間0/1/2)在新的進程
  2. 運行getstore
  3. 調查已知的目標文件
    • 下載量將是當前文件大小(大小)
    • 下載速度會(大小/ current_time - time0)

我想知道是否有一個更簡單的方法。

替代建議表示歡迎(也許我應該使用不同的模塊?)

回答

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

弗拉維奧波萊蒂寫了「觀看LWP的活動」爲The Perl Review, Spring 2009,並顯示了這種技術的許多用途。

+0

感謝您的迴應和例子。弗拉維奧波萊蒂的一頁寫作也很有用和簡潔。 – vlee 2009-11-25 02:34:09

+0

我沒有發現弗拉維奧的一頁寫作簡潔。此外,這個答案並沒有幫助我。我有一個需要下載的非常大的文件,在下載時,我需要使用命名管道將消息發回我的GUI(用Objective C編寫)。我有管道的事情,但還不知道LWP字節迭代器,因爲它下載。 – Volomike 2015-12-02 10:50:40

7

而不是使用LWP::Simple的,直接使用LWP::UserAgent。作爲一個起點,看看LWP :: Simple :: getstore如何初始化$ ua並調用請求。您需要撥打$ua->add_handler指定response_data處理程序來執行任何您想要的操作;默認情況下(至少對於HTTP協議而言)LWP::UserAgent將會讀取最多4Kb塊,併爲每個塊調用response_data處理程序,但是您可以在請求方法參數中建議不同的大小。

如果您想要區分標題數據和將存儲在文件中的實際數據,或者在存在重定向的情況下做一些特殊處理,您可能還需要指定其他處理程序。

+0

謝謝!我知道必須有更好的方法。 – vlee 2009-11-25 02:32:32