Problème de timeout dans script perl sur serveur apache
Salut à tous,
je rencontre un problème de timeout lors de l'exécution d'une instruction assez longue dans un de mes script perl utilisé dans une application web :
Code:
$db->selectFromTable(argXX)
Cette instruction provenant d'une API (je ne peux donc pas toucher au code de la requête) effectue une requête très lourde provoquant le timeout :cry:
Pour palier ce problème, j'avais pensé utiliser une structure de type "until" affichant un "." tant que le tableau @tab n'est pas rempli avec le retour de la méthode $db->selectFromTable(argXX).
Code:
1 2 3
|
print "." until (
@tab =$db->selectFromTable(argXX) ) ; |
Cette solution n'est pas satisfaisante, puisqu'elle ne résout pas mon problème de timeout :?
Est ce que quelqu'un a déjà rencontré ce problème ? Pourquoi le "until" ne règle pas le problème ? Je vois des milliers des points afficher à l'écran mais mon script finit par faire un time out ...
Quelles solutions puis je envisager ?
Nb : la requête pouvant se réveler assez longue, augmenter de façon très importante la durée avant timeout dans ma configuration Apache n'est pas une solution satisfaisante
merci d'avance,
ben :ccool:
problème avec le thread dans une boucle ...
bonjour et merci de ta réponse,
je ne suis pas très familier avec les threads et je commence à me documenter... http://perl.enstimac.fr/DocFr/perlthrtut.html ;)
Pour exécuter un thread, je procède de la sorte :
Code:
1 2 3 4 5
|
for my $resultat (@resultat) {
my $thr = threads->new(\&helloWorld);
print $thr->join() ;
} |
avec :
Code:
1 2 3
| sub helloWorld {
return "hello world" ;
} |
Cependant, je rencontre un problème : l'instruction qui provoque le timeout (problème initial) est appelée plusieurs fois : elle est placée dans une boucle.
Lorsque je fais
Code:
print $thr->join() ;
, mon script s'arrête, et la phrase helloworld n'apparait qu'une seule fois dans ma page web...
Mon fichier de serveur apache, error_log ne comporte pas d'erreur ...
A noter que si je ne fais pas le reste du code se poursuit et le programme ne plante pas, j'utilise cette méthode car j'ai besoin du résultat retourné par le thread.:(
Comment faire pour exécuter mon instruction provoquant le timeout avec un thread sachant que j'ai besoin de récipérer le résultat et que le tout est placé dans une boucle foreach ?
je suis ouvert à toute suggestion ...
merci d'avance,
ben:ccool:
alarm(-1) : semble marcher : quelqu'un peut il confirmer ?
oups toutes mes excuses pour l'agression visuelle, ce n'était pas le but, j'en prends bonne note pour la suite :?,
je viens de tester une nouvelle solution pour empêcher le timeout : l'utilisation de la fonction alarm.
D'après la documentation (http://www.tutorialspoint.com/perl/perl_alarm.htm) : elle s'utilise de la sorte :
Citation:
alarm EXPR
Sets the "alarm," causing the current process to receive a SIGALRM signal in EXPR seconds.
Pour ma part, je l'ai testé avec la valeur '-1' en paramètre et cela semble fonctionner, j'ai lancé l'application avec une grosse requête (pas monstrueuse mais quand même assez lourde) et le job est arrivé à son terme :
Code:
1 2 3 4 5 6 7
|
$SIG{ALRM} = sub {
print "UNKNOWN: Script timed out\n";
exit -1;
};
# Start the timer to script timeout
alarm(-1); |
Que pensez vous de cette solution, est elle valable ? Elle ne ressort nulle part : ni dans google, ni dans la littérature ...
merci d'avance,
ben :ccool: