Dynamisch require'n en mod_perl
23 juni 2005 - 13:55   
geplaatst door: Bram Beernink
Ik kom er niet echt uit. Misschien kan iemand mij helpen of in de goede richting helpen. Ik heb een perl-script die er ongeveer zo uit ziet:


use vars qw($lang);
$lang = $q->param("lang") || "en";
if ($lang eq "nl") {
$lang = "nl";
}

else {
$lang = "en";
}

require "lang/$lang.pl";

print $title{'please_log_in'};
print $lang;

Als de CGI-variable dus niet is gedefinieerd, wordt als taal "en" gekozen en lang/en.pl geopend.

Die ziet er ongeveer als volgt uit:


#!/usr/bin/perl -wT

use strict;
use diagnostics;

use vars qw(%title);

%title = (
please_log_in => "Please log in",
);

En lang/nl.pl ongeveer als volgt:


#!/usr/bin/perl -wT

use strict;
use diagnostics;

use vars qw(%title);

%title = (
please_log_in => "Log a.u.b. in",
);

Als ik mijn mod_perl apache opstart en enkele keren het script oproep krijg ik gewoon alles in het engels en onderaan staat er "en". Als ik dan &lang=nl doe, krijg ik echter in het begin soms de engelse tekst ("Please log in") met onderaan echter wel "nl". Dat is dus niet de bedoeling.

Wat gaat er fout? Kan iemand mij helpen? Alvast bedankt!  :thumbs-up:

(Bewerkt door Bram Beernink om 13:59, 23-06-2005)

Soon there'll be just two kinds of people: Those who use computers, and those who use Apples. - Think different - iMac 15", 768 MB, 700 Mhz G4 - iBook 14", 1GB, 1.42 Ghz G4, 10.5.5 - MessagePad 2000 - iPod nano silver
Dynamisch require'n en mod_perl
25 juni 2005 - 00:12    reactie #1
geplaatst door: ctMAX
Er is denk ik op zich niks fouts aan je scripts. Ik ben dit ook een keer tegengekomen. Het probleem is dat mod_perl allerlei dingen cachet ofzo waardoor waarden die je via allerlei parameters doorgeeft niet altijd kloppen. Ik weet niet precies hoe dat allemaal werkt, weet alleen dat het idd deze gevolgen heeft. Hij onthoud vaak waarden uit een compleet andere sessie. Wat je kan doen is eerst alle modules en scripts die je gebruikt "unloaden" en daarna weer opnieuw inladen. Als je b.v. als je een module "Database" gebruikt doe je dit :

BEGIN {
   delete $INC{"Database"};
}

voordat je hem laad: use Database;

Dat heeft bij mij vaak wel geholpen, zo wordt mod_perl gedwongen de module Database opnieuw in te laden en rekening te houden met de parameters die je eraan meegeeft. Ik vraag me alleen af of je op deze manier niet de voordelen van mod_perl juist kwijtraakt... Mod_perl moet sneller zijn en dat heeft waarschijnlijk een hoop met caching te maken. Ik heb voor het gemak op bepaalde domeinen zelfs mod_perl gedeactiveerd omdat het allerlei problemen met scripts gaf.

Mijn sites host ik bij Site Hosting: http://www.sitehosting.nl