2010-04-19 5 views
0

J'ai un script perl cgi assez gourmand en ressources (il faut environ 2 secondes pour finir). C'est bien tant que seulement 4 ou 5 d'entre eux tournent en même temps et c'est généralement le cas. Le problème est que lorsqu'un utilisateur clique sur un lien qui appelle ce script, un nouveau processus est créé pour gérer cette demande de connexion, donc si un utilisateur clique plusieurs fois (s'il est impatient), le serveur est surchargé de nouveaux processus en cours d'exécution et la plupart d'entre eux sont redondants.Comment puis-je forcer mod_perl à n'autoriser qu'un processus par connexion?

Comment puis-je m'assurer qu'une seule instance de ce processus s'exécute par hôte?

Ceci est un ancien système que je suis en train de maintenir qui utilise un ancien cadre pour le frontend, et je voudrais éviter d'utiliser javascript pour désactiver le côté client du bouton si possible. Convertir ceci en fast-cgi perl est hors de question, encore une fois parce que c'est un vieux système et l'ajout de fast-cgi à Apache pourrait casser beaucoup d'autres choses que cette chose fonctionne.

Répondre

1

Vous souhaitez utiliser un verrou de fichier. Lisez la documentation sur le module Fcntl et la fonction de troupeau: http://perldoc.perl.org/functions/flock.html

Modifier en réponse à un commentaire:

Exemple d'utilisation d'un fichier de verrouillage:

#!/usr/bin/perl 

use strict; 
use warnings; 

use Fcntl qw(:flock); 

local *FH; 
my $opened_file = open(FH,'>/tmp/example_file.lck'); 
if ($opened_file) { 
    print "Lock file was opened successfully\n"; 
    if (flock(FH, &LOCK_EX | &LOCK_NB)) { 
     &do_stuff(); 
    } else { 
     print "Failed to get lock (another process is running)\n"; 
    } 
} else { 
    print "Failed to open lock file: $!\n"; 
} 
close(FH); 

sub do_stuff { 
    print "Locked!\n"; 
    sleep 30; # Pretending to be busy for a long time 
} 
+2

Comment proposez-vous le faire? – ysth

+0

ne fait toujours pas tout à fait ce que je veux, mais il répond à la question initiale donc je l'accepte –