Chris: Counter ist inkonsistent durch falsches Filelocking

Beitrag lesen

Hallo,

wir beutzen eine auf PHP-basis der aus 2 Dateien besteht:

Könntest Du den Satz bitte mal ins Deutsche übersetzen? :-)

$openfile = fopen("count.dat", 'w+');
  flock($openfile, 2);
  fwrite($openfile, $text);
  fclose($openfile);

Was soll das Filelocking hier noch bewirken?
Es ist bei PHP per default "advisory", also nur beratend.
Es hindert also nicht die funktion file(), das hier gerade
neu angelegte und noch leere File auszulesen.

File() ist ohnehin ungeeignet, um in einer Multiuser-Umgebung benutzt zu werden, wenn die ausgelesenen Daten konsistent bleiben müssen. Alle Krücken, die man zum "Sperren" um File() herumbauen könnte, helfen auch nicht wirklich weiter.

Nutze also die normalen fopen(), fread() und fwrite()

Um die Datei anzulegen, musst Du das entweder generell bei der Installation des Zählers tun und Dich nachher darauf verlassen können, dass es auch geklappt hat, oder aber Du musst es zerstörungsfrei machen.

Dazu benutzt man entweder
  $fh = @fopen($dateiname,'+xb');
  if ($fh !== false)
  {
    # hat geklappt, weitermachen
  }
  else
  {
    # Auswerten von $phperrmsg
    # dazu muss track_errors = on sein!
  }

Mit diesem Handle kann dann sofort weitergearbeitet werden

oder aber einfach

$fh = fopen($dateiname,'ab');
  fclose($fh);

$fh = fopen($dateiname,'rb+');

und nun _erst_ locken,
dann auslesen
dann erhöhen
dann zurückspulen
dann schreiben
dann Dateilänge absitmmen (ftruncate())
dann Datei schließen

Durch das Schließen wird sie automatisch entsperrt.

Ich hoffe, dass Du alles verstanden hast.

LG
Chris