MatzeA: Perl 58 Apache und 2 Sripte...

Servus,

in der Hoffung, dass mir jemand exakt erklären kann woran es scheitert nochmals mein Problem.

Ich habe ein Script, das direkt aufgertufen genau das tut was man so erwartet.

#!/usr/bin/perl -w
use Time::Local 'timelocal_nocheck' ;
use strict;

package count;

count("hallo","12345");
count("ha322llo","12345");
count("ha45lo","12345");
count("hal454o","12345");
count("h24ll5o","12345");
count("h2e34lo","12345");
############################################################################

Counter

############################################################################

sub count {
   my ($page,$ipnum)=@_ ;
   my $check = 0;
   my $date= "12345";
   my $lock = 1;
   my $i=0;
   my @output = ("");
   #Daten laden
   open (DAT , "< ./data/stat.log") || die "Kann Datenfile (/data/stat.log) nicht zum Lesen öffnen" ;
   my @lines = <DAT> ;
   close(DAT) ;

#Count schreiben
   foreach my $line (@lines)
      {
         my ($num, $pgname, $ipadress, $datum) = split(/&&/, $line) ;

if ($pgname eq $page)
            {
                $num++;
                $check = 1;
#                push(@output,"$num&&$pgname&&$ipadress&&$datum&&");
            }
         push(@output,"$num&&$pgname&&$ipadress&&$datum&&\n");

}
      if ($check == 0)
      {
      push(@output,"1&&$page&&$ipnum&&$date&&\n");
      }
#   shift(@output);
   open (DAT , "> ./data/stat.log") || die "Kann Datenfile (/data/stat.log) nicht zum Schreiben öffnen" ;
   print (DAT @output);
   close(DAT) ;

}

#sub datum_zeit {
#our $CONFIG;

#my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time+(3600*$CONFIG{'ZEITVERH'}));
#my $datum = sprintf "%02d.%02d.%04d : %02d:%02d" , $mday , $mon+=1 ,$year+=1900 , $hour , $min ;

#return($datum) ;

#}

#############################################################################

ENDE

#############################################################################

Das Ergebnis:

3&&hallo&&12345&&12345&&
3&&ha322llo&&12345&&12345&&
3&&ha45lo&&12345&&12345&&
3&&hal454o&&12345&&12345&&
3&&h24ll5o&&12345&&12345&&
3&&h2e34lo&&12345&&12345&&

Funtkioniert also wundrbar.

Rufe ich es hingegen per Webzugriff auf folgendees Script auf:
Ja dann gibt es die böse Überraschung.
Aber keinen Fehler.

#!c:\perl58\bin\perl.exe -w
#Module
use strict;
use Config::IniFiles;
use CGI::Carp qw(fatalsToBrowser);
use CGI;

#Ermittlung des Scriptnamens und des Verzeichnisses
#und Wechsel in das aktuelle Verzeichnis (CGI)
$0 =~ /^(.*)[/\].*/ && chdir ($1) ;

require "./libs/statistic.cgi" ;

Notwendige Informationen werden gelesen.

Diese müssen immer als POST Parameter übergeben werden.

my $template = "";
my $query     = new CGI;
my $page;
my $cfg = new Config::IniFiles -file => "./conf/conf.ini";

$page = $query->param('seite');

Laden der Configuration aus der ini Datei.

#Host
my $cgi_host= $cfg->val( 'Server', 'DocumentRoot' ) ;

#WWW-Pfad dieses Files (ohne Host)
my $cgi_dir="$cgi_host/cgi-bin" ;

#Backlink (zurück auf der Übersichtsseite)
my $back_link="$cgi_host/index.html" ;

Verzeichnis zu den Bildern.

my $pic_dir="$cgi_host/images/";

Verzeichnis zum template

my $tmpl_dir="$cgi_host/tmpl/";

open (DAT, "< ../$page.html") || die "Kann das Template -tmpl/vote.tmpl- nicht laden." ;
undef $/ ;
my $seite_txt=<DAT> ;
close (DAT) ;

&count::count($page,"127001");

&print_mess($seite_txt);

sub print_mess {

my $mess_txt = shift;

open (DAT, "< tmpl/sturm.tmpl") || die "Kann das Template -tmpl/vote.tmpl- nicht laden." ;
undef $/ ;
my $back=<DAT> ;
close (DAT) ;

$back =~ s/[MESSAGE]/$mess_txt/g ;
$back =~ s/[PICDIR]/$pic_dir/g ;
$back =~ s/[HOME]/$back_link/g ;
$back =~ s/[GETPAGECGI]/$cgi_dir/getpage.cgi/g ;

print "Content-type: text/html\n\n" ;
print $back;

}

jetzt werden nur noch 2 Einträge angezeigt.
Der erstw wird nicht mehr angepasst. Der zweite ändert sich je nach übergabe Werte.
Auch wenn man den aufruf &count::count("hallalalao", "123456");
angibt bessert sich das verhalten nicht.

Kann mir da jemand helfen was dabei schief läuft?

Gruss Matze

  1. Oh je,

    is ja mächtig verworren was du da schreibst.

    Wie wärs damit:

    =cut
    #!perl

    Zaehler, wird per SSI eingebunden

    ###########################################################

    zaehlerdatei

    my $cntfile = '/local/home/example.com/files/cntfile.db';

    Name der SHTML Datei ergibt sich aus der Umgebung

    my $shtmlfile = $ENV{'DOCUMENT_URI'};
    ###########################################################
    use strict;
    use DB_File;

    print "Content-type: text/html\n\n";

    tie (my %cnt, 'DB_File', $cntfile, O_RDWR|O_CREAT, 0644) or exit;
    my $i = $cnt{$shtmlfile};
    $i++;
    $cnt{$shtmlfile} = $i;
    untie %cnt;

    print qq(Dokument <b>$shtmlfile</b> hat <b>$i</b> Seitenaufrufe.);
    exit;
    ###########################################################

    =cut

    Btw,

    falls du scalare mit Trennzeichen in ein Scalar tun willst, empfehle ich, als Trennzeichen ein solches zu verwenden was NICHT per Tastatur eingegeben werden kann, bspw. eine binäre NULL \0

    Und Date's speichere als seconds since the epoch - das macht die Verarbeitung später einfacher.

    Gruss, Erwin

    1. Servus,

      ja das ist eine interesante Variante.

      Allerdings soollte es für einen Java Entwickler der eventuell was dran drehen muss auch lsebar sein.

      Aber egal.

      Viel mehr würde mich interesieren, warum das Script beim direkten Aufruf klappt jedoch beim umweg über einen Webzugriff nicht richtig funktioniert.

      Gruss Matze