Perl 58 Apache und 2 Sripte...
MatzeA
- perl
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");
############################################################################
############################################################################
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) ;
#}
#############################################################################
#############################################################################
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" ;
my $template = "";
my $query = new CGI;
my $page;
my $cfg = new Config::IniFiles -file => "./conf/conf.ini";
$page = $query->param('seite');
#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" ;
my $pic_dir="$cgi_host/images/";
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
Oh je,
is ja mächtig verworren was du da schreibst.
Wie wärs damit:
=cut
#!perl
###########################################################
my $cntfile = '/local/home/example.com/files/cntfile.db';
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
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