Почему директива Apache PerlModule не устанавливает пользовательские переменные среды?

Я создаю веб-сайт mod_perl, и мне нужно установить переменную среды, которая будет использоваться в коде Perl.

До сих пор я использовал директиву PerlSetEnv для установки этой переменной:

    PerlSetEnv MYVAR myvalue

    <LocationMatch /perlpath/>
        SetHandler modperl
        PerlResponseHandler myhandler
        Header set Cache-control "no-cache"
    </LocationMatch>

Это прекрасно работает, но я хотел бы предварительно загрузить обработчик mod_perl, потому что первый вызов очень медленный. Поэтому я изменил свой файл виртуального хоста Apache на:

    PerlSetEnv MYVAR myvalue
    PerlModule myhandler         <- add this line

    <LocationMatch /perlpath/>
        SetHandler modperl
        PerlResponseHandler myhandler
        Header set Cache-control "no-cache"
    </LocationMatch>

Но если я сделаю это, моя пользовательская переменная среды MYVAR не будет установлена ​​при предварительной загрузке myhandler, и мой код не будет работать.

Итак, можно ли установить переменную среды, которая будет экспортироваться директивой PerlModule?


person Michael Mera    schedule 21.09.2012    source источник
comment
Я нашел обходной путь для своей проблемы: передать мою переменную в качестве параметра модуля моего обработчика и получить ее через пользовательскую функцию импорта. Тем не менее, меня все еще интересует любое решение для установки переменных ENV во время предварительной загрузки.   -  person Michael Mera    schedule 21.09.2012


Ответы (2)


Вы можете использовать PerlPassEnv для пересылки переменных env программам, работающим на сервере. Однако они вступают в силу на первом этапе цикла запроса apache, в отличие от setEnv и PassEnv, которые не вступают в силу до фазы исправления.

В прошлом я использовал предложение BEGIN для установки переменной env, такой как ORACLE_HOME, которую я хочу видеть задолго до фазы запроса.

Попробуйте установить переменную внутри блока perl BEGIN в вашем httpd.conf, что может сделать ее гораздо более доступной, чем традиционные директивы.

person angel_007    schedule 23.09.2012
comment
Именно то, что я хотел. Я должен был сам подумать об использовании предложения BEGIN! - person Michael Mera; 24.09.2012

Может быть, вам нужно переместить setenv в конфигурацию вашего виртуального хоста?

<LocationMatch /perlpath/>
    SetHandler modperl
    PerlSetEnv MYVAR myvalue
    PerlResponseHandler myhandler
    Header set Cache-control "no-cache"
</LocationMatch>
person user1126070    schedule 21.09.2012
comment
Я пробовал это, но это не сработало. Я не думаю, что это проблема с областью действия переменных. - person Michael Mera; 24.09.2012