MOD_PERL يتعامل مع مسارات التضمين بشكل مختلف عن CGI؟
سؤال
لديّ نص مكتوب في بيرل ، وتم إعدامه كـ CGI. أنه يعمل بشكل جيد. لقد قمت مؤخرًا بتثبيت وحدة Mod_perl في Apache ، واستخدمت PerlModule Modperl :: Recistry التوجيه.
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 الخاص بي. (أنا دائمًا أستخدم pragma صارمة ، لذلك لا تقلق بشأن المتغيرات العالمية غير الملموسة وأشياء من هذا القبيل).
لا يزال البرنامج النصي الأصلي الخاص بي يعمل على النحو المقصود ، باستثناء شيء واحد ، لم يعد بالإمكان حل الملفات التي قمت بتضمينها في وظيفة require ().
script.cgi:
#!/usr/bin/perl -w
use strict;
use CGI qw(:standard Vars);
require "includes/functions.cgi";
#blah blah, more stuff
السيناريو
#!/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
المحلول
من: http://perl.apache.org/docs/2.0/api/modperl/registry.html
META: توثيق أننا في الوقت الحالي لا نكون chdir () في dir's script ، لأنه يؤثر على العملية برمتها تحت المواضيع. Modperl :: registryPrefork يجب استخدامه من قبل أولئك الذين يعملون فقط تحت MPM المسبق.
لذلك ، إذا كنت تستخدم MPM المسبق لـ APACH2 ، فيجب عليك محاولة استخدام MODPERL :: RegistryPrefork. إذا كنت تستخدم عاملًا أو حدثًا أو Windows ، فسيتعين عليك تغيير برنامجك حتى لا تفترض أن CWD هو الدليل الذي يجلس فيه Perl.