2009-11-22 12 views
2

Lors de l'utilisation du module perl LWP::Simple, existe-t-il un moyen simple de déterminer la vitesse et la quantité téléchargées par un seul appel de getstore()? Cela serait utile pour observer l'état des téléchargements de fichiers volumineux.Comment puis-je déterminer la vitesse et la quantité de téléchargement à partir de getstore() de LWP :: Simple?

Du haut de ma tête, une approche serait de:

  1. magasin le temps actuel (TIME0)
  2. course getstore dans un nouveau processus
  3. sondage le fichier de destination connue
    • le montant téléchargé serait la taille actuelle du fichier (taille)
    • la vitesse de téléchargement serait (size/current_time - time0)

Je me demande s'il y a un moyen plus simple.

suggestions alternative bienvenue (peut-être que je devrais utiliser un module différent?)

Répondre

4

À moins que vous n'ayez d'autres exigences (telles que le visionnage du débit et de la taille pendant le téléchargement), les étapes que vous avez décrites sont les plus faciles à envisager et à mettre en œuvre.

Vous pouvez exporter l'objet utilisateur-agent sous-jacent dans LWP :: Simple. Si vous voulez juste regarder le téléchargement d'un unique, vous pouvez définir le bit show_progress de l'utilisateur-agent:

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

$ua->show_progress(1); 

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

Pour faire plus de travail, vous pouvez utiliser LWP :: Simple et faire toujours le same thing ysth suggests :

use LWP::Simple qw($ua); 

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

Dans ce sous-programme, vous lisez les données et faites ce que vous voulez avec, y compris le maintien d'une minuterie. Une fois que vous obtenez votre réponse, vous pouvez supprimer ce morceau de code et revenir à getstore. Flavio Poletti a écrit "Regarder l'activité de LWP" pour The Perl Review, Spring 2009 et montre de nombreux usages de cette technique.

+0

Merci pour la bonne réponse et les exemples. L'article d'une page de Flavio Poletti était également utile et concis. – vlee

+0

Je n'ai pas trouvé la page d'une page de Flavio concise du tout. De plus, cette réponse ne m'a pas aidé. J'ai un très gros fichier que je dois télécharger, et pendant le téléchargement, j'ai besoin d'utiliser des tubes nommés pour poster un message sur mon interface graphique (écrit en Objective C).J'ai l'affaire des tuyaux, mais je n'arrive pas à comprendre l'itérateur d'octets LWP en cours de téléchargement. – Volomike

7

Au lieu d'utiliser LWP::Simple, utilisez directement LWP::UserAgent. Pour commencer, regardez comment LWP :: Simple :: getstore initialise un $ ua et appelle une requête. Vous voudrez appeler $ua->add_handler pour spécifier un gestionnaire response_data pour faire ce que vous voulez; par défaut (au moins pour le protocole HTTP) LWP::UserAgent lira des blocs de 4 Ko et appellera le gestionnaire response_data pour chaque segment, mais vous pouvez suggérer une taille différente dans les paramètres de la méthode de requête. Vous pouvez également spécifier d'autres gestionnaires si vous souhaitez différencier les données d'en-tête des données réelles qui seront stockées dans le fichier ou faire quelque chose de spécial s'il y a des redirections.

+0

Merci! Je savais qu'il devait y avoir un meilleur moyen. – vlee