3

我有一个用 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() 函数中的文件不再可以解析。

脚本.cgi:

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

#blah blah, more stuff

脚本.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 包括/

函数.cgi 函数.perl

4

1 回答 1

2

来自: http: //perl.apache.org/docs/2.0/api/ModPerl/Registry.html

META:记录目前我们不 chdir() 进入脚本的目录,因为它会影响线程下的整个进程。ModPerl::RegistryPrefork 应该被那些只在 prefork MPM 下运行的人使用。

因此,如果您使用的是 Apache2 的 prefork MPM,您应该尝试使用 ModPerl::RegistryPrefork。如果您正在使用工作程序、事件或窗口,您将不得不更改您的程序以不假定 cwd 是 perl 所在的目录。

于 2010-07-05T18:29:09.647 回答