Bug: Can't find libraries with mod_perl and 01Sep2004
When using 01Sep2004 with
ModPerl, sometimes I get a Error 500 (Internal Server Error). I checked apache logs and saw that -- it's weird -- the
@INC variable some times doesn't contain the
/path/to/twiki/lib directory.
Should it be a
mod_perl issue?
Test case
- Install 01Sep2004 (can be from scratch)
- Test it using regular CGI
- Switch to
mod_perl
I've made
this script to test the contents of
@INC, and, in fact, sometimes it lists the
/path/to/twiki/lib, and sometimes it doesn't.
Environment
| TWiki version: |
TWikiRelease01Sep2004 |
| TWiki plugins: |
DefaultPlugin, EmptyPlugin, InterwikiPlugin |
| Server OS: |
Debian testing, kernel 2.4.26 |
| Web server: |
apache 1.3.31-5, mod_perl 1.29.0.2-12 |
| Perl version: |
5.8.4-2 |
| Client OS: |
Debian |
| Web Browser: |
Mozilla 1.6 Mozilla/5.0 : (X11; U; Linux i686; pt-BR; rv:1.6) Gecko/20040413 Debian/1.6-5 |
--
AntonioTerceiro - 16 Sep 2004
Follow up
It's really weird. I've found some help in
SettingLibPath. The
setlib.cfg file is
there (I've unpacked the distribution as it is), but
sometimes the @INC simply doesn't contain the
/path=to/twiki/lib.
It worked using
PerlSetEnv PERL5LIB /opt/twiki/lib
Well, it should not be necessary ...
--
AntonioTerceiro - 17 Sep 2004
This was one of the problems that drove me away from
mod_perl and towards
SpeedyCGI. I don't bother with
mod_perl any more.
Just an idea, but could it be something to do with
setlib.cfg use of relative paths? If the current directory changes in a
mod_perl process, maybe the next time the process is used it starts up with the changed path. You could experiment with a
print STDERR "CWD IS ",`pwd`;
in setlib.cfg.
--
CrawfordCurrie - 18 Sep 2004
I found this
in the #twiki irc logs:
Can't locate TWiki/UI/Edit.pm in @INC (@INC contains: . /usr/lib/perl5/5.8.3/i386-linux-thread-
multi /usr/lib/perl5/5.8.3 /usr/lib/perl5/site_perl/5.8.3/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.2/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.1/i386-linux-thread-
multi /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.3
/usr/lib/perl5/site_perl/5.8.2 /usr/lib/perl5/site_perl/5.8.1 /u...
FiX: Make a small perl script with these two lines...
#!/usr/bin/perl -wT
unshift @INC, '/var/www/twiki/lib';
Load it with PerlRequire /etc/httpd/conf.d/twiki_mod_perl_startup.pl (example)
Works for me with
mod_perl on Debian (testing) with Apache/1.3.31 Ben-SSL/1.55 (Debian GNU/Linux) PHP/4.3.8-12 mod_perl/1.29
--
MatthiasWientapper - 21 Sep 2004
If this works, can someone please document it (I guess in
ModPerl?) and close this topic? Thanks.
--
CrawfordCurrie - 26 Sep 2004
Setting
PerlSetEnv PERL5LIB [absolute path to twiki/lib] in httpd.conf also worked for me.
As long as the problem itself is not fully understood I would not prefer to close this topic.
--
MatthiasWientapper - 02 Oct 2004
Neither solution worked for me (debian woody, apache 1.3.26)
A more radical (and efficient) solution is just to avoid re-reading a million times what is never changing anyways: just
write directly the good value in the
bin/ scripts, e.g:
for i in distro/bin/*;do
sed -e '/^ *# Set default current working directory/,/require .setlib[.]cfg.;/s/^/#/;s|BEGIN {.*|BEGIN { unshift @INC, "/var/www/twiki/lib";|' \
<$i >installation/$i
done
This comments out all the BEGIN block and replace it by:
BEGIN { unshift @INC, "/var/www/twiki/lib"; }
A general solution would add also the $localPerlLibPath if needed.
--
ColasNahaboo - 14 Dec 2004
None of these suggested fixes will work properly if you are using mod_perl, you'll
always get random 'module not found in @INC' messages in your server log. This is because the dorking around with @INC only lasts until the end of the first run of the script as the aforementioned dorking is in a BEGIN block. See
http://perl.apache.org/docs/1.0/guide/porting.html#_INC_and_mod_perl:
"When running under mod_perl, once the server is up @INC is frozen and cannot be updated. The only opportunity to temporarily modify @INC is while the script or the module are loaded and compiled for the first time. After that its value is reset to the original one. The only way to change @INC permanently is to modify it at Apache startup."
See
ModPerlUnix for a workaround.
--
AlanBurlison - 11 Mar 2006
Fix record