Dieter: Probleme mit dem Readbuffer beim lesen von Dateien

Hallo,

ich habe mir ein mit Perl eine Besucherauswertung geschrieben.

Prinzip ungefähr so:

1. User mit IP erfassen
2. Log-Datei öffnen und auslesen
3. neuen Zugriff eintragen
4. Datei schreiben

Sobald jedoch mehrere Besucher zeitgleich zugreifen (kann nicht genau sagen wieviel) und die Datei schon etwas größer ist wird öffters die Datei zerstört und neu angefangen.

Ich dachte das Perl Rücksicht nimmt falls die Datei gerade von einem anderen Prozeß benutzt wird.

Oder hängt der Readbuffer hinterher?

Wie kann ich das Verbessern?

Habe auch schon mit "Flock" experimentiert aber leider ohne erfolg.

DANKE !!!

  1. Hi Dieter!

    Wie kann ich das Verbessern?

    Man sollte generell erst alle Funktionen und Berechnungen, die man mit den zu speichernden Daten ausführt, in einer Variable speichern und diese dann in der Datei abspeichern. SO ist gewährleistet, dass die Datei wirklich nur so kurz wie nötig geöffnet ist.

    Im Archiv gibt es einen Thread, der dir sicher eine große Hilfe ist: http://forum.de.selfhtml.org/archiv/2000_1/t10343.htm

    MfG Hopsel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
  2. Tag Dieter.

    ich habe mir ein mit Perl eine Besucherauswertung geschrieben. [...] Sobald jedoch mehrere Besucher zeitgleich zugreifen (kann nicht genau sagen wieviel) und die Datei schon etwas größer ist wird öffters die Datei zerstört und neu angefangen.

    Das hört sich in der Tat nach einem Locking-Problem an.

    Ich dachte das Perl Rücksicht nimmt falls die Datei gerade von einem anderen Prozeß benutzt wird.

    Nein, Perl nimmt keine Rücksicht, du kannst mit Hilfe von Perl nur das System *bitten* Rücksicht zu nehmen. Hilfe dabei erhältst du durch das Modul Fcntl. Du musst dir das wie eine Garageneinfahrt vorstellen, die nur eine Spur hat: Flocken bedeutet nichts anderes, als die Ampel an der Einfahrt zu schalten, die Prozesse sind die Autos, die rein und raus wollen. Dabei gibt es drei Möglichkeiten:

    LOCK_EX: Ampel auf Rot, keiner darf rein
    LOCK_SH: Ampel auf Gelb, Achtung, Vorsicht bei der Einfahrt, es könnte einem jemand entgegenkommen
    LOCK_UN: Ampel auf Grün, Einfahrt gestattet

    Allerdings gibt es wie überall Verkehrssünder, die sich über Ampelregelungen hinwegsetzen, zu diesem Zweck gibt es noch die Konstante LOCK_NB. Von LOCK_SH solltest du bei schreibenden Operationen die Finger lassen, da kommt meistens nur Unsinn heraus. Du musst also LOCK_EX nehmen. Einen eleganten Weg des Lockings bietet dir noch das Modul File::NFSLock (das ich selber noch nicht benutzt habe, Fcntl hat bisher ausgereicht), eine Anleitung zum sicheren Öffnen von Dateien findest du auf Programmieren mit CPAN-Modulen.

    Siechfred