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>

これを使用して、cgiperlコードを変更する必要がないことを読みました。(私は常に厳密なプラグマを使用しているので、初期化されていないグローバル変数などについて心配する必要はありません)。

元のスクリプトは意図したとおりに機能しますが、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.cgiscript.perlには/が含まれます

$lsには/が含まれます

関数.cgifunctions.perl

4

1 に答える 1

2

差出人:http ://perl.apache.org/docs/2.0/api/ModPerl/Registry.html

META:スレッドの下のプロセス全体に影響を与えるため、今のところスクリプトのdirにchdir()を入れないことを文書化します。ModPerl :: RegistryPreforkは、preforkMPMでのみ実行するユーザーが使用する必要があります。

したがって、Apache2のプリフォークMPMを使用している場合は、ModPerl::RegistryPreforkを使用してみてください。ワーカー、イベント、またはWindowsを使用している場合は、プログラムを変更して、cwdがperlが置かれているディレクトリであると想定しないようにする必要があります。

于 2010-07-05T18:29:09.647 に答える