Andy: Zähler-Datei springt auf null!

Beitrag lesen

Hi!
Erstmal Danke für die Anworten!

$filename = $Logdir."count.txt";

$filehandler = fopen($filename,"r");
flock($filehandler,1);
$content = fread($filehandler, filesize($filename));
flock($filehandler,3);
fclose($filehandler);
$filehandler = fopen($filename,"w+");
flock($filehandler,2);
$content++;
fwrite($filehandler, $content);
flock($filehandler,3);
fclose($filehandler);

Gut! Das mit dem w+ ist sicher trivaler Fehler, macht aber auch nichts, da ich ja neu schreiben möchte!
Trotzdem kann ich mir nicht vorstellen, was schief läuft! Wenn A lesen will und B lesen will, muss halt B warten! Wenn dann A und B gleichzeitig schreiben wollen, ist IHMO das selbe, A erhält als erstes den Zuschlag und B muss warten! Das einige was passieren kann, ist das A und B den gleichen Zählerstand auslesen und der Zähler dann halt um 1 statt um 2 hochgeht!

function coutner($filename)
{
  $uab = ignore_user_abort(true);   # damit das Script auch zuende läuft

if ($fh = fopen($filename,"a+"))
  {
    if ($lock = flock($fh,LOCK_EX))   # wouldblock funktioniert noch nicht
    {                                 # wir Locken mit Wait und EXCLUSIV
      if($seek = fseek($fh,0,SEEK_SET); an den Anfang der Datei
      {
        $content = fread($filehandler, filesize($filename)); # Datei auslesen
        # Content in Variablen zerlegen
        # Variablen verarbeiten
        # neuen Content aus Variablen zusammenbauen
        # hier:

$content++;

if($seek = fseek($fh,0,SEEK_SET); an den Anfang der Datei
        {
          $write = fwrite($fh,$content);
          if($write)
          {
            ## falls der neue Content kürzer ist als der alte
            $trunc = ftruncate($fh,strlen($content));
          }
        }
      }
      fclose($fh);  ## Datei schließen und Lock aufheben.

ignore_user_abort($uab); ## wieder auf alten Wert zurücksetzen
      return $seek and $write and $trunc;
    }
  }
  else
  {
    ignore_user_abort($uab); ## wieder auf alten Wert zurücksetzen
    return false;
  }
}

So müsste es funktionieren. habs noch nicht degugged.

Sieht schon nicht schlecht aus, vorallem der Zugriff mit einem Filehandler erscheint mir sinnvoll!
Die Konstantennamen (LOCK_EX etc) kannte ich noch gar nicht! Musste mir gleich mal 'ne aktuelle PHP-Doc runterladen, meine war noch von 2001! ;-)

Ich hab noch ein bisschen recherchiert: Auf http://www.php.net/manual/de/function.flock.php steht, dass wenn PHP als CGI-Modul läuft (meinen Provider leider ja), das es vorkommen kann das es nicht funzt!
Ist halt die Frage ob das ignore_user_abort() was bringt bei CGI-Modul oder nicht?
Mit meinen Code oben, wäre die Situation halt, das File wird zum schreiben geöffnet (und dabei inhaltlich gelöscht!) und bevor die Daten geschrieben werden, bricht das Skript ab! Und schon wieder ein Unsicherheitsfaktor! :-(

Man ist halt von der Unwissenheit oder Böswilligkeit der Benutzer nie geschont!

Danke nochmal und Danke für weitere Antworten,
Andy