Я пишу веб-приложение в Perl с Dancer
. Предположим, что я объявлен в A.pm
в our
переменную $var
и присваивают содержание file1
к нему:В веб-приложении Perl «наша» переменная используется в разных ответах на веб-запрос?
sub get_file_content {
our $var = <FILE1>;
}
Я объявленную var
в our
, потому что я хотел бы использовать его позже в другом файле B.pm
:
sub display_file_content {
&display($A::var);
}
Итак, после того, как был выполнен get_file_content
, $var
должен быть содержимым файла1. Перед выполнением display_file_content
я изменил содержимое файла1 и нажал кнопку, чтобы выполнить display_file_content
. Как и предполагалось, было отображено исходное содержимое файла1.
Тогда я сделал то же, что и выше, за исключением того, что после изменения содержимого файла1 я не нажал кнопку display_file_content
. Вместо этого я запускаю другой веб-запрос для той же страницы в другом веб-браузере. Сначала я выполнил get_file_content
, и нажмите кнопку, чтобы перейти через display_file_content
напрямую. Измененное содержимое файла1 было отображено во втором веб-браузере. Это нормально. Однако, когда я нажимаю кнопку дисплея в первом веб-браузере, он также отображает измененный контент, а не оригинальный. Как сравнение с первым экспериментом без второго веб-запроса в другом веб-браузере, кажется, что переменная $var
используется совместно как в процессе веб-запроса-ответа. Но почему это произошло? Не могли бы вы дать несколько объяснений?
Спасибо, я довольно новичок в веб-приложениях, хотя я программировал на Perl в течение многих лет. Я понимаю, что переменная 'our' - это пакет глобальный, и каждый пакет, используемый в программе, может изменять и делиться им, но в двух процессах одной и той же программы у них разные переменные' our'. Итак, что меня смущает, может быть веб-сервер: теперь, когда переменная 'our' является общей, она должна быть в одном процессе. Но как Танцор справляется с двумя запросами в одном процессе с различными ответами в Интернете? Использует ли он поток? Благодарю. – 2013-04-11 06:01:31
Dancer будет использовать модель с несколькими запросами, которую использует веб-сервер. Например. сервер предварительного кодирования будет порождать несколько процессов. Каждый процесс будет иметь свою собственную копию глобальных переменных Perl, но также будет обслуживать несколько запросов поочередно, поэтому, если вы используете глобальные переменные Perl, которые не сбрасываются между запросами, можно получить разные по каждому запросу (по мере того как ваш запрос будет перенаправлен для разделения дочерних процессов). Это иногда нормально (например, если вы кэшируете глобальные данные, извлеченные с диска), но вы должны избегать хранения сеанса, пользователя или запроса данных между запросами. –
@duskast Это не два процесса (или потоки). Если вы находитесь в разработке, вы, вероятно, используете свое приложение с одним сервером процессов. По сути ваше приложение становится сервером, и каждый запрос снова выполняет подпрограмму в том же интерпретаторе. Даже при производстве с многопроцессорным сервером процесс может обслуживать множество запросов, и вы не знаете, какой запрос будет обработан каким-либо процессом. –