Martin Schöler: DATEI beschreiben, manchmal ganze Datei gelöscht.

Hallo !
Ich versuche auf meiner Seite: http://www.gogle.de
einen Counter einzurichten (mit SSI).
Der öffnet immer die Counter-Datei zum lesen,
dann splittet er das Datum und die Zugriffe
und aktualisiert diese Datei.
Das klappt auch wunderbar, aber nur manchmal,
so jeden 2. Tag wird mitten am Tag die ganze Datei
gelöscht und alle Zugriffe (auch von den vorherigen Tagen)
sind verschwunden.
Vielleicht kann das daran liegen, dass 2 Leute zur gleichen Zeit
meine Seite besuchen.

möglicher Grund:
Person 1 Liest Counter-Datei ein und öffnet sie zum schreiben,
aber hat noch nichts reingeschrieben.
Dann öffnet Person 2 diese Datei zum lesen (das Perl-Programm
liest natürlich nichts ein, da diese Datei von Person 1 zum überschreiben
geöffnet wurde). Nachdem Person eins die Datei aktualisiert hat,
aktualisiert die Datei nun auch das Perl-Programm, das von Person
2 gestartet wurde und schreibt nichts rein.

Die Counter-Datei sieht normalerweise z.B. so aus:
Jun-23|4329
Jun-24|3998
Jun-25|5230

und so weiter...

Hier das Perl-Programm:

#!/usr/bin/perl
use Fcntl ':flock';

$Jetztwert = time();
$Jetztzeit = localtime($Jetztwert);
@Zeit = split(/ +/,$Jetztzeit);
$datumheute = "$Zeit[1]-$Zeit[2]";
$erfolg=0;

open (DATEI, "<./tageszaehler.txt");
flock ("tageszaehler.txt", LOCK_EX);
@count = <DATEI>;

#geöfnete Datei wird nach heutigem Datum durchsucht und
#die Besucherzahl wird mit 1 addiert.

foreach (@count)
{
        ($datum, $besucher) = split (/|/, $_);
        if ($datum eq $datumheute)
        {
                $besucher++;
                $_="$datum|$besucher";
                $erfolg=1;
        }
}
close (DATEI);

#nun wird die Datei aktualisiert

open (DATEI, ">./tageszaehler.txt");
print "Content-type: text/ssi\n\n";
print DATEI @count;

#Hier ist die Ausgabe, die auf meiner Seite erscheint:

if ($erfolg eq 0)
{
        print DATEI "$datumheute|1\n";
        print "Gratuliere !!!<br>Sie sind am<br>heutigen Tag der<br>erste Besucher !";
}
else
{
        print "heutige Seitenaufrufe: $besucher";
}
flock ("tageszaehler.txt", LOCK_UN);
close (DATEI);

Für eine Antwort wäre ich SEHR dankbar !

Martin Schöler

  1. Moin,

    Ich versuche auf meiner Seite: http://www.gogle.de

    tsts, pass bloss auf, dass das nicht mal teuer wird.

    möglicher Grund:

    [...]

    wahrscheinlicher (so ziemlich 100%iger) Grund.

    open (DATEI, "<./tageszaehler.txt");
    flock ("tageszaehler.txt", LOCK_EX);
    @count = <DATEI>;

    [...]

    close (DATEI);

    *rumms*
    mit close wird das flock aufgehoben.

    vielleicht helfen dir
    perldoc -f flock [1],
    perldoc perlfaq5 [2] und
    perldoc perlopentut [3]

    weiter.

    Noch ein interessanter Link zum Handling von flock:
    http://groups.google.com/groups?hl=de&safe=off&th=3db2b7849330adcf,29&start=10&ic=1

    Viele Gruesse,

    n.d.p.

    [1] http://perldoc.com/perl5.6/pod/func/flock.html
    [2] http://perldoc.com/perl5.6/pod/perlfaq5.html
    [3] http://perldoc.com/perl5.6/pod/perlopentut.html