|
|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Andrey Sapozhnikov 2:5020/400 27 Feb 2002 21:15:46 To : All Subject : Re: mod_perl&nesting subroutines -------------------------------------------------------------------------------- Sadretdinova Nelly wrote: > Т.е. получается, что такое "размножение" переменных приводит к > потреблению большого количества памяти? > Утечки памяти как таковой не будет, поскольку в интерпретаторе живут только 2 копии переменной. Если конечно в них храниться нечто огромное, то это имеет значение... > Я не очень понимаю механизм работы mod_perl с переменными > > С FastCGI было понятно: все переменные, которые не должны меняться от > одного вызова скрипта к другому, объявляются до FastCGI->accept цикла, > там же им присваиваются значения, которые сидят себе неизменными в памяти. > в mod_perl тоже можно организовать сохранение значений от вызова к вызову, только нет смысла это делать. Дело в том, что интерпретаторов perl несколько - по одному на каждую копию дочернего процесса апача. И никакой гарантии, что следующий вызов придет именно на ожидаемый процесс. Переменные которые вообще никогда не меняются, т.е. константы, лучше и определить как константы. Меньше заморочек в любом коде. > А если у меня при использовании mod_perl есть некие глобальные > переменные, которые не должны меняться от запроса к запросу? (грубо > говоря, некие константы) > Можно определить их как константы или как инлайн функции (предпочтительно для Perl < 5.6.0). use constant MAX_NUM => 2345; или sub MAX_NUM() { 2345; } или определить как глобальные переменные и инициальзировать их только единожды: use vars qw($max_num); BEGIN { $max_num = 1234; } Это пример как писать кусок кода который будет выполнен только 1 раз, при первом обращении к скрипту в данной копии апача. > Если я объявляю переменную в vars, а затем присваиваю ей некое > значение, будет ли оно хранится в таблице имен или при новом вызове > скрипта это присвоение выполнится снова? > Значение то будет храниться. Вот только если инициализация не обрамлена BEGIN{ ... }, то она будет выполняться опять и перетирать старое значение. Если никакой инициализации вообще нет, то будет доступно предыдущее значение, вот только использовать его бессмыслено. Оно может быть секундной давности, а может недельной, может от одного юзера, а может от другого. Как карты лягут. Копий апача обычно с десяток, и на какой придет следующий запрос - никто не ведает. Тот который будет свободен в данный момент. Андрей --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/52845fd9e41e.html, оценка из 5, голосов 10
|