Главная страница


ru.cgi.perl

 
 - RU.CGI.PERL ------------------------------------------------------------------
 From : Artem Chuprina                       2:5020/400     27 Feb 2002  21:28:05
 To : "Nelly Sadretdinova"
 Subject : Re: mod_perl&nesting subroutines
 -------------------------------------------------------------------------------- 
 
 Здравствуй, Nelly Sadretdinova.
 
 NS> > Тут вот в чем дело, функция test на самом деле определена внутри большой,
 NS> > спрятанной от Вас функции которая содержит весь Ваш скрипт. При
 NS> > компиляции функции происходит подстановка адреса переменной %V
 NS> > в скомпилированый код. Дело в том, что переменные определяемые
 NS> > через my (lexical scope) не хранятся в таблицах имен в момент исполнения.
 NS> > При повторном вызове Вашего скрипта (т.е. скрытой функции), в нем
 NS> > происходит создание новой копии переменной %V, вполне себе обнуленой,
 NS> > но функция test продолжает помнить и использовать адрес старой. В итоге,
 NS> > в памяти существует две копии %V - самая первая, запомненная в test и
 NS> более
 NS> > никому не доступная (если нет еще таких же функций), и самая последняя.
 
 NS> Т.е. получается, что такое "размножение" переменных приводит к потреблению
 NS> большого количества памяти?
 
 В данном случае, кажется, все-таки нет - их будет две. Одна, которая залипла в
 функции (функция именованная, поэтому она ровно одна, поэтому залипла там одна
 переменная) и одна внешняя в текущем вызове. Кажется, залипшая переменная
 будет одна на все функции этого скрипта, вне которых она объявлена - они все
 будут ссылаться на одно и то же место.
 
 NS> Я не очень понимаю механизм работы mod_perl с переменными С FastCGI было
 NS> понятно: все переменные, которые не должны меняться от одного вызова
 NS> скрипта к другому, объявляются до FastCGI->accept цикла, там же им
 NS> присваиваются значения, которые сидят себе неизменными в памяти.
 
 Тут все еще понятнее, если понимать, как он вообще устроен. А устроен он
 просто - тело скрипта становится телом некоторой функции некоторого
 образованного внутри процесса пакета, каковая процедура компилируется один раз
 на каждого ребенка апача и живет в нем все время его жизни. Со всеми
 вытекающими, включая то, что функции, определенные внутри скрипта, становятся
 функциями, определенными внутри другой функции. Hекоторая неточность
 заключается в том, что перед каждым выполнением тела скрипта Apache::Registry
 проверяет момент его модификации и перекомпилирует, если он изменился. Для
 включаемых модулей процедура перекомпиляции не производится, и искусственного
 оборачивания не делается.
 
 NS> А если у меня при использовании mod_perl есть некие глобальные переменные,
 NS> которые не должны меняться от запроса к запросу? (грубо говоря, некие
 NS> константы)
 
 Hу, во-первых, бывает use constant...
 
 NS> Если я объявляю переменную в vars, а затем присваиваю ей некое значение,
 NS> будет ли оно хранится в таблице имен или при новом вызове скрипта это
 NS> присвоение выполнится снова?
 
 Будет храниться _и_ при новом вызове скрипта присваивание выполнится снова.
 Если ты присваиваешь сложное выражение, которое долго считается, то можно
 сказать $var ||= expr. Hо следует помнить, что оно, во-первых, там так и
 залипнет, а во-вторых, залипнет именно в этом ребенке апача, а из соседних
 видно не будет. В mod_perl существует способ проинитить чего-нибудь до
 расфоркивания апача, но это надо сначала доки читать, и только потом приходить
 сюда.
 
 -- 
 Artem Chuprina
 Communiware.net
 RFC2822: <ran@ran.pp.ru>, FIDO: 2:5020/358.49, ICQ: 13038757
 --- ifmail v.2.15dev5
  * Origin: Leninsky 45 home network (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 mod_perl&nesting subroutines   Nelly Sadretdinova   26 Feb 2002 21:55:17 
 Re: mod_perl&nesting subroutines   Andrey Sapozhnikov   27 Feb 2002 01:22:27 
 Re: mod_perl&nesting subroutines   Sadretdinova Nelly   27 Feb 2002 15:00:38 
 Re: mod_perl&nesting subroutines   Nelly Sadretdinova   27 Feb 2002 19:59:40 
 Re: mod_perl&nesting subroutines   Artem Chuprina   27 Feb 2002 21:28:05 
 Re: mod_perl&nesting subroutines   Artem Chuprina   27 Feb 2002 14:21:33 
Архивное /ru.cgi.perl/635967e8e3d0.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional