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 !