bon alors finalement le probleme ne venais pas de mon code mais d'une histoire (toujours pas résolue) de droit, de path etc sur le serveur.
Donc je ré-explique mon probleme clairement et donne la solution que j'ai trouver ^_^ :
j'ai deux scripts, un cgi qui sert à interfacer, on le nommeras scrpit interface, et un script perl, on le nommera script travailleur, qui effectues différentes taches, affiches l'état d'avancement sur sa sortie standard et à la fin de son exécution crée un fichier qui contiens quelques résultats.
Mon cgi avais plusieurs rôles à remplir :
tout d'abord il récupérais des information d'un formulaire et crée des fichiers nécessaire au fonctionnement du script travailleur,
puis il devait afficher à l'utilisateur l'état d'avancement du script travailleur pour le faire patienter, et finalement afficher une page de résultat construite avec les données récupérées dans le dernier fichier générer par le script travailleur
(heu j'espère avoir été clair, si vous avez des question n'hésitez pas :p)
voila donc quel était mon problème
voyons maintenant la solution que j'ai utiliser pour le résoudre :
tout d'abord j'ai scinder mon Cgi en 3 partie :
1) pour la création de fichier lorsque l'utilisateur vien du formulaire
2) pour l'affichage de la page d'attente
3) pour les résultats
pour vérifier si l'utilisateur venais bien du formulaire (qui est en methode POST) j'ai rajouter dans le action le paramètre FromForm et mis = à 1, soit :
<form action="path/de/interface.cgi?FromForm=1" method="post" enctype="multipart/form-data">
1)
dans mon script CGI pour savoir si l'appel venait du formulaire il me suffisait de faire :
1 2
| my @url_para = $cgi->url_param();
if ($url_para[0] eq 'FromForm') |
si c'était effectivement le cas je générais alors les fichier et une page de transition qui contenait principalement un balise de redirection automatique de page (au bout de 1seconde)
<meta http-equiv="Refresh" content="1;interface.cgi?date=$date" />
pour générer cette balise avec les méthode cgi :
1 2 3 4 5 6 7 8
| print($cgi->start_html(-head=>meta({-http_equiv => 'Refresh',
-content => "1;interface.cgi?date=$date"
}),
-lang=>'fr-Fr',
-title=>'Page transitoire',
-style=>{'src'=>'../html/fds.css'},
-author=>'xxxx'
) ) ; |
comme on peut le remarquer dans mon code je ne faisait en fait que recharger le cgi en y ajoutant un paramètre : une date générer avec la fonction localtime et qui donc est un identifiant unique pour chaque appelle au CGI.
ensuite le cgi lance le script travailleur en redirigeant sa sortie standard et ses erreurs dans un fichier nommer $date.log, je crée donc un fichier qui à dans son nom l'identifiant unique qui as été crée lors de cette appel du cgi via le formulaire, il faut savoir que le script travailleur demande en entrée le nom du dernier fichier (avec les résultat donc) qu'il créera. Et donc logiquement je fait comme avec le fichier .log je crée un fichier $date.resultats.
Dans tout les cas pour lancer mon script travailleur je doit le lancer et le rendre complètement indépendant du cgi qui l'as lancer
donc ma commande ressemble et le code pour la lancer sont :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| my ($ma_Commande) = 'perl /path/de/script/travailleur.pl '.
" $date.resultats 1>>$date.log 2>&1" ;
if ( defined(my $pid = fork ) )
{
if(!$pid)
{
POSIX::setsid() ;
exec($ma_Commande) ;
}
}
else
{
print('<b>Impossible de crée lancer le programme',
'</b><br />Fin du programme</body></html>') ;
exit 0;
} |
la structure
1 2 3 4 5 6 7
| if ( defined(my $pid = fork ) )
{
if(!$pid)
{
exec($ma_Commande) ;
}
} |
me sert à lancer le script travailleur.
la ligne POSIX::setsid() ; sert quand à elle à rendre le script travailleur completement indépendant de son pére c'est à dire le script interface
la partie
" $date.resultats 1>>$date.log 2>&1"
de ma ligne de commande me sert tout d'abord à donner le nom du fichier résultat et aussi à rediriger les sorties (STDOUT et STDERR) dans le fichier .log
2&3)
Si le CGI n'est pas appeler du script je vérifit que le premier paramètre est bien date et je récupéré alors son contenu dans $date_recue
je teste l'existence du fichier $date_recue.resultats si il existe alors je le lis, récupérè les infos qui me sont nécessaire dedans et génére la page de résulat
si ce fichier n'existe pas je teste alors l'existence du fichier $date_recue.log si il existe je construit une page d'attente qui contiendras le contenu du fichier et surtout qui contient la balise
<meta http-equiv="Refresh" content="5;interface.cgi?date=$date_recue" />
dans tout les autre cas je redirige sur une page d'erreure
Voila je n'ai pas encore tester ma solution pour différents probleme mais je pense que ça peut marcher (corrigez moi si je me trompe ^_^)
Partager