mod_perl обрабатывает пути включения иначе, чем cgi? - PullRequest
3 голосов
/ 29 июня 2010

У меня есть скрипт, написанный на Perl и исполняемый как CGI.Работает нормально.Недавно я установил модуль mod_perl в apache и использовал директиву PerlModule ModPerl :: Registry.

PerlModule ModPerl::Registry
PerlModule CGI
PerlSendHeader On

Alias /perl/ /real/path/to/perl/scripts/
<Location /perl>
SetHandler  perl-script
PerlHandler ModPerl::Registry
Options ExecCGI
</Location>

<Files *.perl>
SetHandler  perl-script
PerlHandler ModPerl::Registry
Options ExecCGI
</Files>

Я читал, что с помощью этого мне не нужно изменять мой код CGI Perl.(Я всегда использую строгую прагму, поэтому не беспокойтесь о неинициализированных глобальных переменных и подобных вещах).

Мой оригинальный скрипт по-прежнему работает, как задумано, за исключением одного, файлы, которые я включил в функцию require (), больше не могут быть разрешены.

script.cgi:

#!/usr/bin/perl -w
use strict;
use CGI qw(:standard Vars);
require "includes/functions.cgi";

#blah blah, more stuff

script.perl

#!/usr/bin/perl -w
use strict;
use CGI qw(:standard Vars);
require "includes/functions.perl"; # <---- Returns error:  Can't locate includes/functions.perl in @INC
#blah blah, more stuff

Структура каталогов работает следующим образом:

$ ls

script.cgi script.perl включает в себя /

$ ls включает в себя /

functions.cgi functions.perl

1 Ответ

2 голосов
/ 05 июля 2010

От: http://perl.apache.org/docs/2.0/api/ModPerl/Registry.html

META: документируйте, что пока мы не выполняем chdir () в директории скрипта, потому что это влияет на весь процесс в потоках. ModPerl :: RegistryPrefork должен использоваться теми, кто работает только под prefork MPM.

так что, если вы используете prefork MPM в Apache2, вам следует попробовать использовать ModPerl :: RegistryPrefork. Если вы используете работника, или событие, или Windows, вам придется изменить свою программу, чтобы не предполагать, что cwd является каталогом, в котором находится perl.

...