mod_perl обрабатывает пути включения иначе, чем cgi?

У меня есть сценарий, написанный на 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


person Razor Storm    schedule 28.06.2010    source источник
comment
Похоже, что includes/functions.perl правильно расположен, но другую зависимость body.html.cgi найти не удалось. Следует ли переименовать этот файл с .cgi в .perl, как вы, кажется, уже сделали? Он не был скопирован в каталог сценария mod_perl?   -  person pilcrow    schedule 29.06.2010
comment
Ой, извините, я написал неправильное сообщение об ошибке. Сообщение об ошибке, которое он вернул, было Can't locate includes / functions.perl in @INC, body.html.cgi - это что-то еще, не связанное с этим.   -  person Razor Storm    schedule 29.06.2010


Ответы (1)


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

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

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

person Adam    schedule 05.07.2010