|
|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/635967e8e3d0.html, оценка из 5, голосов 10
|