Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将环境变量传递给自动加载的mod_perl处理程序,以便在模块加载时使用?_Perl_Apache_Mod Perl2 - Fatal编程技术网

如何将环境变量传递给自动加载的mod_perl处理程序,以便在模块加载时使用?

如何将环境变量传递给自动加载的mod_perl处理程序,以便在模块加载时使用?,perl,apache,mod-perl2,Perl,Apache,Mod Perl2,我有一个mod_perl的HTTP请求处理程序,它需要在模块加载时从%ENV读取一个环境变量。使用指令将环境变量从Apache配置传递到mod_perl 这很好,直到出于性能原因,我们在启动时将Apache配置更改为处理程序。当模块像这样自动加载时,PerlSetEnv不会在模块加载时生效,我们需要的变量只能在处理程序方法内的请求时从%ENV中获得 是否有办法继续使用自动加载,但仍然在Apache配置中设置环境变量,该变量在模块加载时在Perl的%ENV中可用? 最简单的例子: 这里有一个简化的

我有一个mod_perl的HTTP请求处理程序,它需要在模块加载时从
%ENV
读取一个环境变量。使用指令将环境变量从Apache配置传递到mod_perl

这很好,直到出于性能原因,我们在启动时将Apache配置更改为处理程序。当模块像这样自动加载时,
PerlSetEnv
不会在模块加载时生效,我们需要的变量只能在处理程序方法内的请求时从
%ENV
中获得

是否有办法继续使用自动加载,但仍然在Apache配置中设置环境变量,该变量在模块加载时在Perl的
%ENV
中可用?

最简单的例子: 这里有一个简化的测试用例来说明这个问题

未启用自动加载的Apache配置

PerlSwitches -I/home/day/modperl
<Location /perl>
    SetHandler modperl
    PerlSetEnv TEST_PERLSETENV 'Does it work?'
    PerlResponseHandler ModPerl::Test
    Allow from all
</Location>
在浏览器中查看localhost/perl时,我看到:

ENV:
  MOD_PERL: mod_perl/2.0.5
  MOD_PERL_API_VERSION: 2
  PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  TEST_PERLSETENV: Does it work?
ENV_AT_MODULE_LOAD:
  MOD_PERL: mod_perl/2.0.5
  MOD_PERL_API_VERSION: 2
  PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  TEST_PERLSETENV: Does it work?
万岁
TEST_PERLSETENV
在模块加载时可用,这是我们想要的

但是当我们更改Apache配置以启用自动加载时(在PerlResponseHandler中使用+,如下所示):

我得到以下输出:

ENV:
  MOD_PERL: mod_perl/2.0.5
  MOD_PERL_API_VERSION: 2
  PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  TEST_PERLSETENV: Does it work?
ENV_AT_MODULE_LOAD:
  MOD_PERL: mod_perl/2.0.5
  MOD_PERL_API_VERSION: 2
  PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

嘘<代码>TEST_PERLSETENV在模块加载时不再可用:(如何在保持自动加载行为的同时将其取回?

Argh,发布此问题30秒后,我找到了答案。谢谢

PerlSetEnv
移动到包含
PerlResponseHandler
指令的
块之前,它将再次工作

i、 e.像这样:

PerlSwitches -I/home/dbarr/modperl
PerlSetEnv TEST_PERLSETENV 'Does it work?'
<Location /perl>
    SetHandler modperl
    PerlResponseHandler +ModPerl::Test
    Allow from all
</Location>
PerlSwitches-I/home/dbarr/modperl
PerlSetEnv TEST_PerlSetEnv“它有效吗?”
SetHandler modperl
PerlResponseHandler+ModPerl::Test
通融
ENV:
  MOD_PERL: mod_perl/2.0.5
  MOD_PERL_API_VERSION: 2
  PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  TEST_PERLSETENV: Does it work?
ENV_AT_MODULE_LOAD:
  MOD_PERL: mod_perl/2.0.5
  MOD_PERL_API_VERSION: 2
  PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PerlSwitches -I/home/dbarr/modperl
PerlSetEnv TEST_PERLSETENV 'Does it work?'
<Location /perl>
    SetHandler modperl
    PerlResponseHandler +ModPerl::Test
    Allow from all
</Location>