Come posso accedere alla configurazione del server Apache in un blocco BEGIN in mod_perl?
Domanda
Ho provato a passare dall'uso di PerlSetEnv all'utilizzo di custom direttive di configurazione . Ho il mio modulo di configurazione con una copia di set_val
dai documenti:
sub set_val
{
local our ($key, $self, $parms, $arg) = @_;
$self->{$key} = $arg;
unless ($parms->path)
{
local our $srv_cfg = Apache2::Module::get_config($self, $parms->server);
$srv_cfg->{$key} = $arg;
}
}
... che viene chiamato da ogni sub direttiva personalizzata. Quindi ho nel mio .conf:
PerlLoadModule MyModule::ServerConfig
MyCustomDirective 'hello'
Funziona bene in quanto httpd -t va bene la sintassi del file. Il problema è che non riesco a ottenere il valore dal file di configurazione da un blocco BEGIN, cosa che devo fare.
Ho provato ad armeggiare con ogni sorta di cose:
BEGIN
{
use Apache2::CmdParms ();
# use Apache2::Directive ();
use Apache2::Module ();
# use Apache2::ServerUtil ();
# use Apache2::RequestUtil ();
use Data::Dump;
warn ddx(Apache2::Module::get_config('MyModule::ServerConfig', Apache2::CmdParms->server));
# warn ddx(Apache2::Directive->as_hash);
# warn Apache2::ServerUtil->dir_config('MyCustomDirective);
# warn Apache2::CmdParms->server->server_hostname();
}
... ma inutilmente. La maggior parte dei miei sforzi (tentando di accedere a CmdParms->server
per esempio) si traducono in Parent: child process exited with status 3221225477 -- Restarting
e un riavvio automatico di Apache come dice. Se passo ServerUtil->server to get_config()
, il server rimane attivo ma l'avviso stampa solo "1".
Ho letto da qualche parte che ciò è dovuto al fatto che non è possibile ottenere nulla relativo alle richieste in un blocco BEGIN
, poiché le richieste variano. In un certo senso ha senso, tranne per il fatto che con PerlOptions + GlobalRequest sono stato in grado di vedere $ENV
all'interno di un blocco Apache2::RequestUtil->request->per\_dir\_config()
, quindi perché non dovrei essere in grado di vedere le mie direttive, tanto quanto dipendono da come la richiesta accade? Particolarmente confuso è che se provo a passare da get_config()
a Global $r object is not available.
, dice <=> Se questo è vero in un blocco <=>, come posso arrivare a <=>?
Soluzione 2
In parte, Dump non viene utilizzato correttamente. Funziona meglio:
use Data::Dump qw(pp);
warn pp(Apache2::Module::get_config('MyModule::ServerConfig', Apache2::ServerUtil->server));
Tuttavia, non mostra alcuna direttiva che appare all'interno di < Directory > blocchi.
Nel mio caso particolare, tuttavia, non ho bisogno di quella funzionalità, ripensandoci; quello sembra essere il punto in cui li avevo bloccati.
Altri suggerimenti
Prova ad aggiungere ciò che vuoi import
ad un altro modulo e use
questo modulo nel codice in cui di solito metti BEGIN
blocco. Dovrebbe funzionare lo stesso. Può essere utile.