Apache fastcgi: есть ли средства для динамической проверки значения ENV при использовании подпрограммы? - PullRequest
0 голосов
/ 11 декабря 2018

Я прошу прощения, если определение проблемы немного несвязно.Мы атаковали эту проблему во многих различных направлениях.

Основное описание, у нас есть веб-сайт, на котором мы пытаемся предоставить переводы для использования Locale :: TextDomain

У нас есть сценарии fastcgi, которые вызывают нашлокальная библиотека модулей perl.Fastcgi и перевод сложны (как мы его используем), потому что язык устанавливается при запуске скрипта и сохраняется.

Так что в нашей библиотеке модулей Perl это работает.

package SR::Locale;
our $LOCALE_NAMESPACE = 'es';
use Locale::TextDomain::UTF8 qw( $LOCALE_NAMESPACE );
our $word = __("football");

Но мы не можем найти способ динамически установить переменную $ LOCALE_NAMESPACE при запуске.Мы хотели бы установить его на основе request_uri или пути dir исполняемого скрипта или чего-то в этом роде.Итак, мы хотели бы сделать что-то вроде, но мы не можем понять это в быстрой настройке cgi:

package SR::Locale;
$ENV{REQUEST_URI} =~ m{example.com/(..)/}
our $LOCALE_NAMESPACE = $1;
use Locale::TextDomain::UTF8 qw( $LOCALE_NAMESPACE );
our $word = __("football");

в этом примере (для fastcgi), $ ENV {REQUEST_URI} пусто вмодуль при запуске скрипта.

Любая помощь будет принята с благодарностью.Мне не удалось найти ссылки на перевод и fastcgi, работающие вместе в Perl.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Одна очевидная проблема заключается в том, что присвоение времени выполнения для $LOCALE_NAMESPACE, которое использует захват из регулярного выражения в $ENV{REQUEST_URI}, запускает после оператора use, где используется эта переменная, поскольку все используйте операторы, выполняемые во время компиляции.

Если единственная проблема состоит в том, как установить $LOCALE_NAMESPACE во времени для use, сделайте это в BEGIN phase

package SR::Locale;

my $LOCALE_NAMESPACE;

BEGIN { 
    # Add a check that $ENV{REQUEST_URI} is indeed set by the environment
    ($LOCALE_NAMESPACE) = $ENV{REQUEST_URI} =~ m{example.com/(..)/};
}

use Locale::TextDomain::UTF8 qw( $LOCALE_NAMESPACE );

Не забывайте, что это BEGIN должно предшествовать use утверждениям, которые на него полагаются.Весь код, который выполняется в фазе BEGIN, выполняется в порядке его появления в исходных файлах (включая любые дальнейшие операторы use или BEGIN блоков внутри модулей use d).

0 голосов
/ 11 декабря 2018

Я не так много знаю о переводе в среде fastcgi, но я знаю, что use - это оператор времени компиляции, поэтому оператор use в вашем скрипте будет первым, что Perl выполнит (даже до инициализации $LOCALE_NAMESPACE.

Эквивалент use MODULE ARGS во время выполнения равен

require MODULE;
MODULE->import(ARGS);

Иногда это работает для динамической настройки модуля во время выполнения, хотя такжеимеет много режимов отказа.

...