Francois Lafont
2014-04-06 01:01:18 UTC
Bonjour à tous,
À vrai dire, je ne sais pas trop dire si mon problème est lié à Perl
ou bien à Apache2. Du coup, je poste sur 2 groupes en même temps. Sur
une Debian Wheezy, j'ai installé Apache2 et Perl CGI avec :
apt-get install apache2 libapache2-mod-perl2
Ensuite, j'ai configuré le site "default" comme ceci :
----------------------------------------------------------
<VirtualHost *:80>
ServerAdmin ***@localhost
DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
SetHandler perl-script
PerlResponseHandler ModPerl::Registry
PerlOptions -ParseHeaders
Options +ExecCGI -MultiViews -SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
----------------------------------------------------------
Après, j'ai mis le script test.pl ci-dessous dans
/usr/lib/cgi-bin/ :
----------------------------------------------------------
#!/usr/bin/perl
use strict;
use warnings;
use share::module;
use 5.010;
use CGI;
my $q = CGI->new;
print $q->header();
foreach my $key (keys %share::module::hash) {
say "BEFORE: $key --> [$share::module::hash{$key}]";
}
# Update the hash.
$share::module::hash{d} = 4;
$share::module::hash{e} = 5;
foreach my $key (keys %share::module::hash) {
say "AFTER: $key --> [$share::module::hash{$key}]";
}
----------------------------------------------------------
et j'ai mis le fichier module.pm dans /etc/apache2/share/.
Voici son contenu :
----------------------------------------------------------
package share::module;
use strict;
use warnings;
use 5.010;
our %hash = ( a => 1,
b => 2,
c => 3,
);
1
----------------------------------------------------------
Puis j'ai redémarré apache2. Ensuite, je teste mon script Perl
avec curl :
$ curl http://localhost/cgi-bin/test.pl
BEFORE: c --> [3]
BEFORE: a --> [1]
BEFORE: b --> [2]
AFTER: e --> [5]
AFTER: c --> [3]
AFTER: a --> [1]
AFTER: b --> [2]
AFTER: d --> [4]
Ça correspond donc à ce que j'attendais (j'appelle cette
sortie la sortie 1). Mais si je relance plusieurs fois la
commande, je finis (au bout de 3 ou 4 exécutions de curl)
par avoir ça :
$ curl http://localhost/cgi-bin/test.pl
BEFORE: e --> [5]
BEFORE: c --> [3]
BEFORE: a --> [1]
BEFORE: b --> [2]
BEFORE: d --> [4]
AFTER: e --> [5]
AFTER: c --> [3]
AFTER: a --> [1]
AFTER: b --> [2]
AFTER: d --> [4]
Et une fois que j'ai ça (j'appelle cette sortie la sortie 2),
j'ai l'impression que ça ne bouge plus j'ai toujours cette sortie
2. Si je redémarre apache2, je me retrouve avec la sortie 1 à
nouveau mais au bout de 3 ou 4 curl, je retombe sur la sortie 2
etc. etc.
Pourquoi je finis par avoir cette sortie 2 ? Elle signifie
qu'au moment même où le script perl s'exécute, j'ai déjà
%share::module::hash qui est mis à jour alors qu'en principe
la première boucle "for" du script test.pl arrive *avant*
la mise à jour de %share::module::hash. Du coup je ne comprends
pas trop.
Si jamais je me débarrasse du module "share::module" et que
je mets directement le hash dans le script test.pl, je ne
constate pas ce phénomène.
Est-ce possible de faire en sorte que l'état du script test.pl
« reparte à zéro » à chaque requête (via curl dans mon cas).
Merci d'avance pour votre aide.
À vrai dire, je ne sais pas trop dire si mon problème est lié à Perl
ou bien à Apache2. Du coup, je poste sur 2 groupes en même temps. Sur
une Debian Wheezy, j'ai installé Apache2 et Perl CGI avec :
apt-get install apache2 libapache2-mod-perl2
Ensuite, j'ai configuré le site "default" comme ceci :
----------------------------------------------------------
<VirtualHost *:80>
ServerAdmin ***@localhost
DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
SetHandler perl-script
PerlResponseHandler ModPerl::Registry
PerlOptions -ParseHeaders
Options +ExecCGI -MultiViews -SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
----------------------------------------------------------
Après, j'ai mis le script test.pl ci-dessous dans
/usr/lib/cgi-bin/ :
----------------------------------------------------------
#!/usr/bin/perl
use strict;
use warnings;
use share::module;
use 5.010;
use CGI;
my $q = CGI->new;
print $q->header();
foreach my $key (keys %share::module::hash) {
say "BEFORE: $key --> [$share::module::hash{$key}]";
}
# Update the hash.
$share::module::hash{d} = 4;
$share::module::hash{e} = 5;
foreach my $key (keys %share::module::hash) {
say "AFTER: $key --> [$share::module::hash{$key}]";
}
----------------------------------------------------------
et j'ai mis le fichier module.pm dans /etc/apache2/share/.
Voici son contenu :
----------------------------------------------------------
package share::module;
use strict;
use warnings;
use 5.010;
our %hash = ( a => 1,
b => 2,
c => 3,
);
1
----------------------------------------------------------
Puis j'ai redémarré apache2. Ensuite, je teste mon script Perl
avec curl :
$ curl http://localhost/cgi-bin/test.pl
BEFORE: c --> [3]
BEFORE: a --> [1]
BEFORE: b --> [2]
AFTER: e --> [5]
AFTER: c --> [3]
AFTER: a --> [1]
AFTER: b --> [2]
AFTER: d --> [4]
Ça correspond donc à ce que j'attendais (j'appelle cette
sortie la sortie 1). Mais si je relance plusieurs fois la
commande, je finis (au bout de 3 ou 4 exécutions de curl)
par avoir ça :
$ curl http://localhost/cgi-bin/test.pl
BEFORE: e --> [5]
BEFORE: c --> [3]
BEFORE: a --> [1]
BEFORE: b --> [2]
BEFORE: d --> [4]
AFTER: e --> [5]
AFTER: c --> [3]
AFTER: a --> [1]
AFTER: b --> [2]
AFTER: d --> [4]
Et une fois que j'ai ça (j'appelle cette sortie la sortie 2),
j'ai l'impression que ça ne bouge plus j'ai toujours cette sortie
2. Si je redémarre apache2, je me retrouve avec la sortie 1 à
nouveau mais au bout de 3 ou 4 curl, je retombe sur la sortie 2
etc. etc.
Pourquoi je finis par avoir cette sortie 2 ? Elle signifie
qu'au moment même où le script perl s'exécute, j'ai déjà
%share::module::hash qui est mis à jour alors qu'en principe
la première boucle "for" du script test.pl arrive *avant*
la mise à jour de %share::module::hash. Du coup je ne comprends
pas trop.
Si jamais je me débarrasse du module "share::module" et que
je mets directement le hash dans le script test.pl, je ne
constate pas ce phénomène.
Est-ce possible de faire en sorte que l'état du script test.pl
« reparte à zéro » à chaque requête (via curl dans mon cas).
Merci d'avance pour votre aide.
--
François Lafont
François Lafont