mod_perl работы, обернув каждый сценарий Perl в подпрограмме называется handler
в пакете на основе имени и пути сценария. Вместо того, чтобы запускать новый процесс для запуска каждого скрипта, эта подпрограмма handler
вызывается одним из нескольких постоянных атак Perl.
Обычно это знание поможет многое понять изменения в окружающей среде от mod_cgi, но так как вы никогда не добавил use strict
в своих программах и ознакомиться с работой объявленных переменных у вас есть много догоняющего делать !
mod_perl среды имеет потенциал для вызывая неочевидные нарушения безопасности, и вы должны начать сейчас use strict
на каждый сценарий и объявить каждую переменных. use Carp
также поможет вам понять журналы ошибок.
Имя переменной, объявленное our
, является синонимом лексической области для переменной пакета с тем же именем, которая может быть использована без полного определения имени путем включения имени пакета. Например, обычно переменная, объявленная с our $var
, обеспечит доступ к скаляру $main::var
(если ранее не было объявления package
) без указания main::
. Однако такие переменные, которые начали жизнь с значения undef
в mod_cgi, теперь сохраняют свои значения из предыдущего выполнения любого заданного потока mod_perl, и для согласованности наиболее безопасно всегда инициализировать их в точке объявления. Также обратите внимание, что имя пакета по умолчанию больше не main
из-за обертывания, которое mod_perl делает, поэтому вы больше не можете обращаться к переменным пакета с помощью префикса main::
, и неразумно найти фактическое имя пакета и явно использовать это потому что это будет очень длинное имя и изменится, если вы переместите или переименуете свой скрипт.
A my
переменная является той, которая существует независимо от таблицы символов пакета, и обычно ее время жизни - это время выполнения прилагаемого файла (для переменных, объявленных в области файла) или подпрограммы. Они безопасны в mod_perl, если оба объявлены и используются в области содержимого сценария или полностью в рамках одной подпрограммы, но вы можете быть ужалены, если вы смешиваете области и объявляете my $global
в области файлов, а затем пытаетесь использовать их в подпрограмме. Причина этого не проста, но она вызвана mod_perl, обертывая ваш скрипт в подпрограмме handler
, поэтому у вас есть вложенные объявления подпрограмм. Внутренняя подпрограмма будет иметь тенденцию принимать только первый экземпляр $global
и игнорировать любые другие, созданные более поздними вызовами до handler
. Если вам нужна глобальная переменная, вы должны объявить ее с помощью our
и инициализировать ее в этой декларации, как описано выше.
Переменная переменная очень похожа на переменную our
, поскольку она образует синоним переменной пакета. Однако он временно сохраняет текущее значение этой переменной и предоставляет новую копию для использования до конца области или области блока. Из-за его автоматического создания и удаления в пределах своей области применения он может быть полезной альтернативой переменной my
в сценариях mod_perl, особенно если вы используете указатели на структуры данных, такие как, например, экземпляр класса CGI
. Объявление our $cgi = CGI->new
правильно создало бы объект, но из-за mod_perl's persistence оставил бы его в памяти, пока следующее выполнение потока не удалит его, чтобы освободить место для другого.
Что касается ваших вопросов:
Использование переменной без объявления либо вызывает ошибку компиляции, если use strict
на месте, как это должно быть. В противном случае это синоним этой переменной в текущем пространстве имен пакетов.
Переменные - это либо переменные пакета, либо лексические переменные; нет способа объявить переменную как private как таковой. Лексические переменные (объявленные с my
) будут созданы и уничтожены при каждом выполнении сценария, если вы не создали недопустимое закрытие , как описано выше, написав подпрограмму, которая использует переменную, объявленную в более широкой области, когда переменная будет но не будет делать то, что вы хотите. Переменная, объявленная с our
, сохранит свое значение во всех вызовах сценария, а объявленный с помощью local
будет уничтожен при завершении сценария. Обе переменные our
и local
являются переменными пакета, и все ссылки на одно и то же имя переменной относятся к одной и той же переменной.
Чтобы объявить переменную, которая постоянно доступна везде, в любом вызове скрипта, вы можете использовать переменную local
или инициализированную переменную our
. В области файлов local $global
в значительной степени эквивалентен our $global = undef
для mod_perl скриптов. Если вы используете переменную our
, чтобы указать на структуру данных, то не забудьте уничтожить ее в конце скрипта с помощью undef $global
.
my
переменные являются уникальными для, и видимые внутри, блока, в котором они были объявлены, независимо от того, что представляет собой блок в пределах if
, while
или for
, или даже просто голой { ... }
блок-области. Всегда используйте переменные my
для временных рабочих переменных, которые используются только внутри блока и доступны из ниоткуда.
Я надеюсь, что это помогает
, если только вы не должны взаимодействовать с кишками Apache, если вы просто хотите, чтобы ускорить процесс, рассмотреть пропуская mod_perl и перейти непосредственно к [Plack] (https: // metacpan.org/module/Plack) и FastCGI. mod_perl связывает вас с Apache, раздувает весь HTTP-процесс и может утечка памяти. Многие веб-фреймворки Perl плавно работают с Plack. Однако у него есть аналогичные проблемы с глобальными и лексическими переменными, поэтому ваш вопрос остается актуальным. – Schwern
@ Zillo: вы пошли очень тихо. Получите ли один из этих ответов то, что вам нужно знать? – Borodin
@Schwern Я пытался запустить FastCGI на Lighttpd, но настроить его было непросто.Я использую FastCGI для PHP на Lighttpd, но, похоже, сложнее установить FastCGI для обработки скриптов Perl. – Zillo