2009-02-11 7 views
1

Dans httpd.conf J'ai:Pourquoi ma variable de section <Perl> n'est-elle disponible que sous mod_perl?

<Perl> 
    $MyPackage::foo = { ... }; 
</Perl> 

Selon les documents, cela devrait, car il est qualifié, persister à mes scripts Perl, qui sont exécutés avec le gestionnaire de modperl. Et parfois ils le font. Mais tout ce que j'ai à faire est de toucher MyPackage.pm, et tout d'un coup $ MyPackage :: foo est maintenant undef. Redémarrez le serveur Web, et cela fonctionne à nouveau.

Quelqu'un at-il une fin à mes larmes? Ma meilleure estimation est que le bloc ne s'exécute qu'une seule fois, lorsque le fichier .conf est analysé, puis un nouveau thread récupère le fichier rechargé. Mais pourquoi ne pas courir une fois par thread? N'y a-t-il pas quelque chose que je puisse utiliser en plus des $ ENV et des directives personnalisées qui sont chargées une seule fois par serveur, puis copiées sur tous les interprètes? (J'utilise probablement la mauvaise terminologie à la fin ici, mais vous avez l'idée.)

Répondre

0

Je l'ai compris tout en le tapant, mais je pensais que je partagerais au cas où il aurait sauvé quelqu'un d'autre les poils que je viens de tirer en dehors.

La solution la plus simple consiste à renommer la variable scope dans le .conf à quelque chose que vous n'êtes pas réellement utiliser:

<Perl> 
    $MyPackageConfig::foo = { ... }; 
</Perl> 

... et ensuite votre forfait réelle ramasser:

package MyPackage; 
our $foo = $MyPackageConfig::foo; 

Cela semble avoir fonctionné régulièrement quand je l'ai testé.

Questions connexes