Могу ли я иметь переменную области приложения в Perl? - PullRequest
1 голос
/ 22 мая 2009

Я немного новичок в Perl / CGI и пришел из Java / JSP.

Я пишу небольшой прототип и мне нужно загрузить некоторые "тяжелые" данные (~ 200 МБ) в структуру данных.

Теперь я, очевидно, хотел бы избежать загрузки данных при каждом запросе. До сих пор мне удавалось использовать «статическую» переменную (одна заключена в блок {}), но, похоже, это работает для нескольких запросов. Через некоторое время бездействия следующий запрос должен будет снова загрузить данные.

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

Как установить переменную "global" или "application"? Не уверен, применимы ли эти условия к CGI ... Можно ли иметь переменную, совместно используемую всеми сеансами приложения?

Кстати, я сейчас использую «use CGI qw (: standard)».

Ответы [ 5 ]

6 голосов
/ 22 мая 2009

CGI-скрипты выполняются и затем завершаются после каждого запроса. Ваша переменная 200 МБ будет загружаться каждый раз.

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

Посмотрите на что-то вроде MLDBM , DBD :: SQLite или DBM :: Deep

См. Справка по Scoping для получения информации о переменной области действия в Perl.

Курс CGI Овидия также является хорошим ресурсом для обучения написанию скриптов CGI на Perl.

5 голосов
/ 22 мая 2009

CGI-программы запускаются в отдельном процессе для каждого запроса. Это часть протокола CGI .

Так что это невозможно, пока вы связаны с CGI. Вы уверены, что связаны с CGI?

Если вы используете Apache, и в Apache mod_perl либо скомпилирован, либо доступен как динамически загружаемый модуль, можно запускать сценарии perl в процессе и повторно использовать данные; есть даже режим совместимости, в котором вы можете писать свои CGI-скрипты в обычном режиме (используя «use CGI»), и они автоматически перетаскиваются модом, так что содержимое внутри блоков BEGIN запускается только один раз.

1 голос
/ 22 мая 2009

Попробуйте CGI :: Session модуль.

Обратите внимание, однако, что, как и Даниэль Мартин и daotoad, постоянство составляет вне области действия CGI; вам нужно использовать какое-то дополнительное хранилище для сохранения состояния.

1 голос
/ 22 мая 2009

Вы смотрели на модуль Storable и его методы замораживания / оттаивания, чтобы заморозить структуру вашего объекта и временно сохранить ее? CPAN> Хранится

Storable позволит вам записывать и извлекать вашу структуру из и во все, что может считаться базой данных, включая Беркли или даже плоские файлы. Хотя 200 МБ - это большой кусок для хранения, вы можете перегруппировать данные в меньшие хэши, которые легко объединяются.

И это очень быстро.

0 голосов
/ 02 июня 2009

Я бы рассмотрел просмотр CGI :: Fast на вашем месте. CGI :: Fast облегчает написание постоянной CGI-программы. Другой хороший вариант, в зависимости от того, на что похожа ваша структура данных, - это использовать Cache :: Memcached (или его более быстрый родственник Cache :: Memcached :: XS ) для перемещения структуры данных вне вашей программы, но все равно оставьте его в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...