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

Web Perl Discussion :

lancer un processus en tache de fond depuis un CGI


Sujet :

Web Perl

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 66
    Points
    66
    Par défaut lancer un processus en tache de fond depuis un CGI
    Bonjour,

    Ma question a déjà été abordée dans plusieurs discussions.

    J'ai un CGI A appelle un autre CGI B qui effectue des traitements en fonction des paramètres saisis dans le formulaire de A. Ce deuxième CGI met un temps énorme pour faire les traitements (+/- 30 min). Ce qui provoque une erreur au niveau du serveur (erreur 500).

    J'essaie donc de lancer le script B qui met du temps à s'exécuter en tache de fond depuis A.

    Voilà où j'en suis.
    Dans le script A, via un formulaire, l'utilisateur fait un choix et valide celui-ci. Le paramètre saisi par l'utilisateur est récupéré dans le même script ce qui remplit la condition pour lancer la commande system() qui se charge de lancer le script B en tâche de fond.

    Voici le script A accueil.pl :
    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
    #!C:/wamp/apps/Perl/bin/perl.exe
    use strict;
    use warnings;
    use DBI;
    use CGI;
    use CGI::Carp qw(fatalsToBrowser);
     
    my $cgi = CGI->new;
     
    if ($cgi->param('tableau')) {
      my $param = $cgi->param('tableau');
      my $commande = 'perl C:/wamp/www/traitement.pl '.$param.' &';
      system($commande);
      # redirection
      my $url_redirection = "accueil.pl";
      print $cgi->header(-Refresh=>"30; URL=$url_redirection");
    }
    else {
      print $cgi->header();
     
      print $cgi->start_html();
     
      print '
    	<form method="post" action="accueil.pl">
    		<p><input type="radio" name="tableau" id="t2_1" value="79"/>tableau fruits</p>
    		<p><input type="radio" name="tableau" id="t2_2" value="157"/>tableau légumes</p>
    		<p><input type="submit" value="Lancer le traitement" /></p>
    	</form>
      ';
     
      print $cgi->end_html();
    }
    Qui est chargé de lancé le script B traitement.pl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/perl
    use strict;
    use warnings;
    use DBI;
     
    # Récupération du tableau à traiter
    my $tableau = $ARGV[0];
     
    # traitement qui prend du temps avec pleins de requêtes dans MySQL...
    Une fois, le commande system() exécutée, j'effectue une redirection du script A sur lui-même.
    Lorsque je fais des traitements moins longs dans B la redirection ne fonctionne pas avant que le script B aie terminé ses traitements.
    Lorsque je fais le traitement complet dans B, j'ai l'erreur 500 qui s'affiche.

    Si quelqu'un a une lecture, une méthode de travaille, voire une solution à me conseiller je suis preneur !

  2. #2
    Membre du Club
    Femme Profil pro
    Ingénieur d'études
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études

    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    pour une autre problèmatique j'ai également rencontré cet inconvénient. La seule solution que j'ai trouvé pour l'instant : convertir mes scripts CGI en scripts FastCGI. Il se peut que tu aies un module complémentaire à ajouter dans ta configuration d'Apache.

    Bon courage, Norore.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Août 2008
    Messages : 505
    Points : 712
    Points
    712
    Par défaut
    Dans un cas pareil, il me semble qu'on se pose beaucoup de contraintes à essayer de tout faire rentrer dans le strict cadre du cgi. Je connais pas le problème suffisamment, mais il me semble que dans ce cas, je ferais un script A qui gère les paramètres, et les poserait quelque part (fichier texte, base de données, peu importe,...). Et je lancerais par cron un script B qui vérifierait toutes les 1,5, 10 minutes en fonction de la pertinence si de nouvelles données doivent être traitées. Si oui, il les traite. Ses résultats sont stockés dans un fichier texte, une base de données, pour être exposées via un script C.

    L'avantage de cette méthode, c'est que l'on demande pas à un process fils d'apache de traiter des trucs pendant plus d'une demi-heure, dans un état indéfini, avec une sortie standard théoriquement dans le socket tcp de celui qui a lancé le script. Pendant que B tourne, ce qui doit être présenté à l'utilisateur n'est pas défini.
    Avec la méthode que j'expose, ca me parait plus clair et plus simple.

    Tout cela reste un avis, bien évidemment.

Discussions similaires

  1. lancer une appli en tache de fond
    Par Guig74 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 07/12/2007, 12h46
  2. Lancer un navigateur en tache de fond
    Par rori dans le forum Windows Forms
    Réponses: 1
    Dernier message: 05/09/2007, 13h33
  3. Lancer une application en tache de fond
    Par nanu dans le forum Administration système
    Réponses: 6
    Dernier message: 22/06/2006, 17h31
  4. Lancer un programme en tache de fond
    Par hlr dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 14/05/2006, 22h04
  5. [DOS]Lancer un executable en tache de fond
    Par raptor70 dans le forum Windows
    Réponses: 1
    Dernier message: 27/10/2005, 14h54

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