Почему директива 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 Директива?

2 ответа

Решение

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

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

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

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

<LocationMatch /perlpath/>
    SetHandler modperl
    PerlSetEnv MYVAR myvalue
    PerlResponseHandler myhandler
    Header set Cache-control "no-cache"
</LocationMatch>
Другие вопросы по тегам