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