IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modules Perl Discussion :

Gérer les coupures avec LWP


Sujet :

Modules Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Points : 49
    Points
    49
    Par défaut Gérer les coupures avec LWP
    Hier je faisais mumuse (c les vacances ), avec un script utilisant lwp quand ma connection adsl c'est coupé , le script a donc attendue dans les 10 secondes et c'est arrété.

    Je voudrais donc savoir si il existe un fonction de LWP pour gérer les coupure de connection ?

    Par exemple si au bout de 15 s aucune donné n'arrive il se met a pinguer free.fr et tant qu'il n'a pas de réponse ben il fait rien

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 210
    Points : 99
    Points
    99
    Par défaut
    Heu ben tu fait un cache

  3. #3
    Membre actif
    Inscrit en
    Février 2005
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 167
    Points : 203
    Points
    203
    Par défaut Re: Gérer les coupures avec LWP
    Citation Envoyé par siaoly
    Hier je faisais mumuse (c les vacances :D ), avec un script utilisant lwp quand ma connection adsl c'est coupé :? , le script a donc attendue dans les 10 secondes et c'est arrété.
    Parce que tu n'as pas testé voir si le get() a fonctionné ?

    Citation Envoyé par siaoly
    Par exemple si au bout de 15 s aucune donné n'arrive il se met a pinguer free.fr et tant qu'il n'a pas de réponse ben il fait rien
    Sous Unix, tu peux utiliser alarm() pour cela. Avec windows c'est une autre paire de manches.

    Mais à mon avis, il faut juste vérifier le code de retour du get(). Si ça ne marche pas, tu sleepes 60 secondes et puis tu réessayes. Tu essaies 3 fois, et au bout de trois échecs tu abandonnes. Ça couvrira 99% des problèmes de réinitialisation de la connexion de courte durée

    N

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Points : 49
    Points
    49
    Par défaut
    Ah oki mais comment faire pour dire a perl de n'effectuer l'action que trois fois ?

    J'ai encore une question sur LWP peut ton mettre LWP::RobotUA et use LWP::UserAgent; dans le même script ?

    Je veut dire utilise les callback de LWP::UserAgent

    par exemple le script suivant est il bon dans l'utilisation de lwp ?



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #!/usr/bin/perl -w
    use LWP::UserAgent;
    use HTTP::Request;
    use HTTP::Response;
    use LWP::RobotUA;
     
     
    	 my $ua = LWP::UserAgent->new;
    	     $ua = LWP::RobotUA->new('Mozilla/5.0 (compatible; Bot/1.01)', '%%%@%%%%.com');
             $ua->agent('Mozilla/5.0 (compatible; Bot/1.01)');
             $ua->protocols_allowed( ['http'] );
             $ua->timeout(4);
             $ua->requests_redirectable( ['HEAD'] );
             # $ua->cookie_jar({ file => "$ENV{HOME}\/\.cookies\.txt" });
             $ua->max_redirect(10);
             $ua->protocols_forbidden( ['mailto','https','gopher','ftp','socks','file'] );
     
     
     
                my $request = HTTP::Request->new('GET', 'http://www.free.fr');
     
                  my $res = $ua->request($request);
     
                  # Check the outcome of the response
                   if ($res->is_success)
                    {
     
                    print $res->content;
     
     
                  }

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    Je recherche également comme toi le moyen de relancer l'agent 3 fis en cas de coupure mais cela ne marche pas ??

    Voici la fonction que j'ai faite pour LWP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
     
    sub OpenDoc {
    	my $url=@_[0];
    	my $mode=@_[1];
    	my $proxy=@_[2];
    	my $timeout=@_[3];
    	my $protocole=@_[4];
    	my $apparence=@_[5];
    	my $authentify=@_[6];
    	my $login=@_[7];
    	my $password=@_[8];
    	my @contentAndBase;
    	my $base;
    	my $content;
    	my $header;
     
    	my $browser = LWP::UserAgent->new();
    	$browser->agent($apparence);
    	$browser->timeout($timeout);
     
    	if ($mode==1) {
    		$browser->proxy($protocole,$proxy);
    	}
    	my $request = HTTP::Request->new(GET => $url);
     
    	if ($authentify==1) {
    		$request->authorization_basic ("$login","$password");
    	}
     
    	my $response= $browser->request($request);
     
    	if ($response->is_error()) {
    		print FILELOG "Error with $url: " . $response->status_line . "\n";
    		print "ETL Error with $url\n" . $response->status_line . "\n";
    		$content= "ETL Error with $url\n" . $response->status_line . "\n";
    		$base= "";
    		$header="";
     
    	}
    	else {
    		$content=$response->content();
    		$base=$response->base;
    		$header=$response->header(content_type);
    	}
    	push (@contentAndBase,$base);
    	push (@contentAndBase,$content);
    	push (@contentAndBase,$header);
    	return @contentAndBase;
    }
    j'ai donc ajouter des conditions dans cette partie mais en vain ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    if ($response->is_error()) {
    		print FILELOG "Error with $url: " . $response->status_line . "\n";
    		print "ETL Error with $url\n" . $response->status_line . "\n";
    		$content= "ETL Error with $url\n" . $response->status_line . "\n";
            $base= "";
            $header="";
            my $response= $browser->request($request);
            if ($response->is_error()) {
            .......
            .......
            .......
           }
    	}
    	else {
    		$content=$response->content();
    		$base=$response->base;
    		$header=$response->header(content_type);
    	}
    Comment procéder ?

    Merci,
    panaone

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    L'algorithmique est la base de tout en programmation... Ce genre de question montre que vous n'en avez pas fait assez, essayez, c'est très utile !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    sub OpenDoc {
      my ($url, $mode, $proxy, $timeout, $protocole, $apparence,
        $authentify, $login, $password, $nb_try) = @_;
      my $base;
      my $content;
      my $header;
     
      my $browser = LWP::UserAgent->new();
      $browser->agent($apparence);
      $browser->timeout($timeout);
     
      if ($mode==1) {
        $browser->proxy($protocole,$proxy);
      }
      my $request = HTTP::Request->new(GET => $url);
     
      if ($authentify==1) {
        $request->authorization_basic ("$login","$password");
      }
     
      my $response= $browser->request($request);
     
      while ($response->is_error()) {
        $nb_try--;
        unless( $nb_try ) {
          print FILELOG "Error with $url: " . $response->status_line . "\n";
          print "ETL Error with $url\n" . $response->status_line . "\n";
          $content= "ETL Error with $url\n" . $response->status_line . "\n";
          $base= "";
          $header="";
     
          return ($base, $content, $header);
        }
        $response= $browser->request($request);
      }
     
      $content=$response->content();
      $base=$response->base;
      $header=$response->header('content_type');
     
      return ($base, $content, $header);
    }
    J'ai nettoyé quelque peu le code de ta fonction et rajouté un paramètre pour spécifier le nombre d'essai (à toi de voir si tu dois le mettre au début des paramètres ou lui donner une valeur par défaut).

    --
    Jedaï

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Points : 49
    Points
    49
    Par défaut
    Heu j'ai pas tout compris comment comment ont fait la même chose pour cd script par exemple


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #!/usr/bin/perl -w
    use LWP::UserAgent;
    use HTTP::Request;
    use HTTP::Response;
     
     
     
        my $ua = LWP::UserAgent->new;
             $ua->agent('Mozilla/5.0 (compatible; Bot/1.01)');
             $ua->protocols_allowed( ['http'] );
             $ua->timeout(4);
             $ua->requests_redirectable( ['HEAD'] );
             # $ua->cookie_jar({ file => "$ENV{HOME}\/\.cookies\.txt" });
             $ua->max_redirect(10);
             $ua->protocols_forbidden( ['mailto','https','gopher','ftp','socks','file'] );
     
     
     
                my $request = HTTP::Request->new('GET', 'http://www.free.fr');
     
                  my $res = $ua->request($request);
     
                  # Check the outcome of the response
                   if ($res->is_success)
                    {
     
                    print $res->content;
     
     
                  }

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    C'est quand même pas si dur de faire une boucle autour de la requête tant qu'il y a erreur !!! (Et pourrais tu faire l'effort d'avoir une indentation correcte s'il te plaît : les bons éditeurs de texte font ça tout seul !)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #nombre d'essai de la requète
    my $nb_try = 3; 
    #premier essai
    my $res = $ua->request($request);
     
    while( $res->is_error ){
      #on diminue le nombre d'essais restant
      $nb_try--;
      #on meurt si il n'y a plus d'essais à faire
      die "La requète a échoué après trois essais !" unless $nb_try;
      #on refait un essai dans le cas contraire
      $res = $ua->request($request);
    }
     
    print $res->content;
    --
    Jedaï

  9. #9
    Nouveau membre du Club
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    Merci jedai , a voir le code c'était assez simple alors que je n'avais pas pensé au UNLESS !!!

    ps: j'ai pourtant fait de L'algorithmie !!


    Merci t'assures ...

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Mais comment faire pour gérer les coupures plus longue je veut dire j'ai un ti robot et une freebox si ma connection ce coupe , ben elle prend un petit moment avant de repartie.

    Mais ma véritable intérrogation est comment écrire un cache et redémarrer de celui-ci , dans le cas d'un robot ?

  11. #11
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Quand on a une coupure plus longue, on rajoute quelques conditions qui font qu'à partir d'un certain nombre de "loupés", on vérifie un site de référence (google par exemple) et si ça ne marche pas, on sleep() pendant un certain temps, avant de retester google, etc...

    --
    Jedaï

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    C'est bien ce que je pensais encore merci Jedai jeune padawan

  13. #13
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Un petit tag Résolu si c'est OK.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DAO] Comment gérer les liens avec la bdd dans mes classes?
    Par Wormus dans le forum Autres
    Réponses: 6
    Dernier message: 22/02/2006, 16h14
  2. gérer les alias avec outlook
    Par Chico_Latino dans le forum Outlook
    Réponses: 3
    Dernier message: 02/02/2006, 17h40
  3. Gérer les dates avec SQL Server 2000
    Par saby dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/01/2006, 18h06
  4. Où gérer les transactions avec Firebird ?
    Par DMO dans le forum Débuter
    Réponses: 2
    Dernier message: 26/04/2005, 09h21
  5. Gérer les queue avec sql server ?
    Par devdev dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 17/06/2004, 17h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo