![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
Ramirez |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 18.1.2005 Где: Moscow, ExUSSR Репутация: 4 Всего: 5 |
Кто знаком с сабжем, помогите расставить все по местам.
mod_perl-скрипты компилируются 1 раз на этапе загрузки веб-сервера (при условии что они грузятся через perlrequire в конфиге апача). значит, если некий пакет создает глобальную переменную при иннициализации, она будет жива от начала запуска апача до его останова. и доступна видимо будет всем процессам апача? эдакий "shared memory" получается? из этого следует, видимо, что если я открою подключение к бд, например, и привяжу его к этой переменной, то оно тоже будет одно, на все процессы апача? Я правильно себе представляю механизм? С мод_перл я, скорее, на "вы", поэтому извиняюсь за сумбурное изложение... Спасибо. |
|||
|
||||
djkostya |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 16.5.2006 Где: Москва Репутация: нет Всего: 2 |
Да с shared memory так и получиться....
Коннект постоянный лучше используйте Apache::DBI |
|||
|
||||
Ramirez |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 18.1.2005 Где: Moscow, ExUSSR Репутация: 4 Всего: 5 |
Я такой фокус пытаюсь с Net::Telnet проделать. И получается, что он все равно плодит подключения на каждый процесс веб сервера. А мне хочется одного на всех добиться. Код примерно такой:
В конфиге апача следующее:
В preload.perl прописано: use MyPack; Собственно, чего я ожидаю: при старте апача компилируется и загружается MyPack, в нем создается переменная $telnet, которая должна быть общая на все копии апача. Потом, при обработке запроса от клиента, вызывается процедура somesub и (при первом вызове) к этой переменой аттачится обьект Net::Telnet. Так как он глобальный, все последующие вызовы (в том числе и от других клиентов, других копий апача) не должны плодить новых коннектов (новых копий Net::Telnet).... а они плодят. Почему? Вообще, проблема к Net::Telnet отношения не имеет, т.к. также ведет себя любая переменная: она всегда пустая при инициализации нового запроса. Т.е. модуль может и компилируется при старте апача, но инициализируется он каждый раз как-бы "с нуля". Видимо это происходит в тот момент когда отпочковывается новая копия апача, хотя больше похоже что вообще на каждый новый запрос. PS: хотя вцелом - вполне логично... апач ведь копированием себя размножается.... поэтому сколько апачей - столько и коннектов =( обкурился уже исходниками Apache::DBI, как оно работает?! обьясните кто нибудь "на пальцах" =) Это сообщение отредактировал(а) Ramirez - 7.8.2007, 12:44 |
||||
|
|||||
Ramirez |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 18.1.2005 Где: Moscow, ExUSSR Репутация: 4 Всего: 5 |
Вобщем, я заставил его работать так как мне хотелось, но несколько неожиданным способом:
в файле preload.perl, который указан в конфиге апача в директиве PerlRequire, сделал так:
и тогда, действительно, подключение создается одно, при старте апача, и оно общее для всех копий апача. Но почему это работает именно так, я что-то не до конца понимаю. Так что вопрос всетаки остается открытым. |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый Ramirez, дело в том, что созданная Вами глобальная переменная является глобальной для всех процессов только на чтение, если какой-то процесс пишет в нее, то происходит COW (копирование при записи) и новое значение становится глобальным для этого процесса, остальные процессы видят первоначальное значение.
В последнем примере, значение глобальной переменной присваивается при компиляции, поэтому оно доступно всем процессам. Это сообщение отредактировал(а) ginnie - 31.3.2008, 11:52 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
Ramirez |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 18.1.2005 Где: Moscow, ExUSSR Репутация: 4 Всего: 5 |
Про копирование при записи я не занл, спасибо! Но непонятен мне несколько другой момент: почему пространство имен скомпилированое при старте внутри мастер-процесса "расшаривается" между потомками, именно расшаривается (может я плохо тестил?) т.е. потомки могут туда и писать и при этом все изменения видны. т.е. копирования не происходит. Это баг или фича? =) Опять-же повторюсь, может я плохо тестил. Сейчас попробую еще ряд экспериментов поставить.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |