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:
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:
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 :) !