problème mod_perl et require (ou variable globale ?)
3 réponses
paul POULAIN
Bonjour,
Toujours en essayant de mettre Koha sous mod_perl, je rencontre le problème
suivant :
my @array= ('script1.pl','script2.pl','script3.pl');
# chaque script contient 3 fonctions, qui ont toujours le même nom
# (fonctionA, fonctionB et fonctionC)
# et sont
# utilisées pour définir des sortes de "plugins".
my @resultats;
foreach (@array) {
require $_;
my $result = fonctionA()+fonctionB()-fonctionC();
push @resultats, {plugin => $_, resultat => $result};
}
cela fonctionne parfaitement sans mod_perl : on obtient des résultats
conformes aux attentes.
Avec mod_perl, c'est la cata.
- On obtient des résultats changeant sans logique.
- ca ressemble à :
script1.pl = resultat de script1.pl;
script2.pl = resultat de script1.pl
script3.pl = resultat de script1.pl
ou :
script1.pl = resultat de script1.pl
script2.pl = resultat de script3.pl
script3.pl = resultat de script1.pl
ou autre choses bizarres du genre.
Est-ce que le require a un comportement particulier avec mod_perl ? je n'ai
rien trouvé à ce sujet sur ggl
--
Paul
Je me réponds à moi-même : faire un "do $plugin" au lieu d'un "require $plugin" résoud le problème visiblement. -- Paul
espie
In article <enthqt$1cqv$, paul POULAIN wrote:
Je me réponds à moi-même : faire un "do $plugin" au lieu d'un "require $plugin" résoud le problème visiblement.
Bon, ben ca, ca permet d'avoir une explication...
require $plugin a un fonctionnement de type `bibliotheque', en particulier, le hash %INC est mis a jour en fonction de ce qui a ete deja vu, histoire de ne pas re-inclure le meme fichier.
Par contre, do $plugin se contente de lire le fichier, sans affecter aucunement %INC.
Ce qui se passe ici, c'est que tes plugins sont `sales' et ne se comportent pas comme des bibliotheques: il faut voir que, sous mod_perl, tout ton code perl est execute a partir du meme contexte. Ce qui veut dire, en particulier, que les bibliotheques ne sont pas relues, puisque %INC est mis a jour la premiere fois...
A l'arrivee, ton truc fonctionne, mais de facon pas tres efficace ni tres jolie... je t'engage chaudement, petit bout par petit bout, a essayer de nettoyer tes bibliotheques. Quelques use strict et un peu de lecture de la doc, en particulier de la fin de perlmodlib, qui explique comment fabriquer ses propres modules, devraient faire des miracles...
In article <enthqt$1cqv$1@biggoron.nerim.net>,
paul POULAIN <paul.poulain_nospam@free.fr.invalid> wrote:
Je me réponds à moi-même :
faire un "do $plugin" au lieu d'un "require $plugin" résoud le problème
visiblement.
Bon, ben ca, ca permet d'avoir une explication...
require $plugin a un fonctionnement de type `bibliotheque', en particulier,
le hash %INC est mis a jour en fonction de ce qui a ete deja vu, histoire
de ne pas re-inclure le meme fichier.
Par contre, do $plugin se contente de lire le fichier, sans affecter aucunement
%INC.
Ce qui se passe ici, c'est que tes plugins sont `sales' et ne se comportent
pas comme des bibliotheques: il faut voir que, sous mod_perl, tout ton
code perl est execute a partir du meme contexte. Ce qui veut dire, en
particulier, que les bibliotheques ne sont pas relues, puisque %INC est
mis a jour la premiere fois...
A l'arrivee, ton truc fonctionne, mais de facon pas tres efficace ni tres
jolie... je t'engage chaudement, petit bout par petit bout, a essayer de
nettoyer tes bibliotheques. Quelques use strict et un peu de lecture de
la doc, en particulier de la fin de perlmodlib, qui explique comment fabriquer
ses propres modules, devraient faire des miracles...
Je me réponds à moi-même : faire un "do $plugin" au lieu d'un "require $plugin" résoud le problème visiblement.
Bon, ben ca, ca permet d'avoir une explication...
require $plugin a un fonctionnement de type `bibliotheque', en particulier, le hash %INC est mis a jour en fonction de ce qui a ete deja vu, histoire de ne pas re-inclure le meme fichier.
Par contre, do $plugin se contente de lire le fichier, sans affecter aucunement %INC.
Ce qui se passe ici, c'est que tes plugins sont `sales' et ne se comportent pas comme des bibliotheques: il faut voir que, sous mod_perl, tout ton code perl est execute a partir du meme contexte. Ce qui veut dire, en particulier, que les bibliotheques ne sont pas relues, puisque %INC est mis a jour la premiere fois...
A l'arrivee, ton truc fonctionne, mais de facon pas tres efficace ni tres jolie... je t'engage chaudement, petit bout par petit bout, a essayer de nettoyer tes bibliotheques. Quelques use strict et un peu de lecture de la doc, en particulier de la fin de perlmodlib, qui explique comment fabriquer ses propres modules, devraient faire des miracles...
paul POULAIN
Marc Espie wrote:
Ce qui se passe ici, c'est que tes plugins sont `sales' et ne se comportent pas comme des bibliotheques: il faut voir que, sous mod_perl, tout ton code perl est execute a partir du meme contexte. Ce qui veut dire, en particulier, que les bibliotheques ne sont pas relues, puisque %INC est mis a jour la premiere fois...
Oui, c'est tout à fait clair comme explication, et j'avais eu la même conclusion.
A l'arrivee, ton truc fonctionne, mais de facon pas tres efficace ni tres jolie... je t'engage chaudement, petit bout par petit bout, a essayer de nettoyer tes bibliotheques. Quelques use strict et un peu de lecture de la doc, en particulier de la fin de perlmodlib, qui explique comment fabriquer ses propres modules, devraient faire des miracles...
ah, là, je ne suis pas sûr : je sais fabriquer des modules (il y en a pas mal dans Koha), mais là, c'est différent : il s'agit de petits bouts de code qui permettent à l'utilisateur de paramétrer le comportement de certains champs de saisie HTML. Lesquels comportements sont activables ou pas (en fonction de la bibliothèque [au sens non technique] et du pays ou elle se trouve, je t'épargne les détails métiers). Ajoutons que certaines bibliothèques ont développé des plugins spécifique à leur usage, et qui n'intéressent personne d'autre qu'elles ! L'avantage du "do", c'est qu'il est simple de rajouter un plugin, il suffit de créer un fichier avec les 3 fonctions nécessaires, et de le déposer dans CVSROOT/cataloguing/value_builder/mon_plugin_a_moi_tout_seul.pl Rien à toucher dans le code existant de Koha, le reste se fait tout seul. Maintenant, il y a peut être qqc qui m'échappe et je veux bien apprendre encore...
-- Paul
Marc Espie wrote:
Ce qui se passe ici, c'est que tes plugins sont `sales' et ne se
comportent pas comme des bibliotheques: il faut voir que, sous mod_perl,
tout ton code perl est execute a partir du meme contexte. Ce qui veut
dire, en particulier, que les bibliotheques ne sont pas relues, puisque
%INC est mis a jour la premiere fois...
Oui, c'est tout à fait clair comme explication, et j'avais eu la même
conclusion.
A l'arrivee, ton truc fonctionne, mais de facon pas tres efficace ni tres
jolie... je t'engage chaudement, petit bout par petit bout, a essayer de
nettoyer tes bibliotheques. Quelques use strict et un peu de lecture de
la doc, en particulier de la fin de perlmodlib, qui explique comment
fabriquer ses propres modules, devraient faire des miracles...
ah, là, je ne suis pas sûr : je sais fabriquer des modules (il y en a pas
mal dans Koha), mais là, c'est différent : il s'agit de petits bouts de
code qui permettent à l'utilisateur de paramétrer le comportement de
certains champs de saisie HTML. Lesquels comportements sont activables ou
pas (en fonction de la bibliothèque [au sens non technique] et du pays ou
elle se trouve, je t'épargne les détails métiers).
Ajoutons que certaines bibliothèques ont développé des plugins spécifique à
leur usage, et qui n'intéressent personne d'autre qu'elles !
L'avantage du "do", c'est qu'il est simple de rajouter un plugin, il suffit
de créer un fichier avec les 3 fonctions nécessaires, et de le déposer dans
CVSROOT/cataloguing/value_builder/mon_plugin_a_moi_tout_seul.pl Rien à
toucher dans le code existant de Koha, le reste se fait tout seul.
Maintenant, il y a peut être qqc qui m'échappe et je veux bien apprendre
encore...
Ce qui se passe ici, c'est que tes plugins sont `sales' et ne se comportent pas comme des bibliotheques: il faut voir que, sous mod_perl, tout ton code perl est execute a partir du meme contexte. Ce qui veut dire, en particulier, que les bibliotheques ne sont pas relues, puisque %INC est mis a jour la premiere fois...
Oui, c'est tout à fait clair comme explication, et j'avais eu la même conclusion.
A l'arrivee, ton truc fonctionne, mais de facon pas tres efficace ni tres jolie... je t'engage chaudement, petit bout par petit bout, a essayer de nettoyer tes bibliotheques. Quelques use strict et un peu de lecture de la doc, en particulier de la fin de perlmodlib, qui explique comment fabriquer ses propres modules, devraient faire des miracles...
ah, là, je ne suis pas sûr : je sais fabriquer des modules (il y en a pas mal dans Koha), mais là, c'est différent : il s'agit de petits bouts de code qui permettent à l'utilisateur de paramétrer le comportement de certains champs de saisie HTML. Lesquels comportements sont activables ou pas (en fonction de la bibliothèque [au sens non technique] et du pays ou elle se trouve, je t'épargne les détails métiers). Ajoutons que certaines bibliothèques ont développé des plugins spécifique à leur usage, et qui n'intéressent personne d'autre qu'elles ! L'avantage du "do", c'est qu'il est simple de rajouter un plugin, il suffit de créer un fichier avec les 3 fonctions nécessaires, et de le déposer dans CVSROOT/cataloguing/value_builder/mon_plugin_a_moi_tout_seul.pl Rien à toucher dans le code existant de Koha, le reste se fait tout seul. Maintenant, il y a peut être qqc qui m'échappe et je veux bien apprendre encore...