Otto 2: Datei setzt sich von selbst auf 0 Byte

Hi,

Ich habe vor zwei Monaten eine PHP Datei geschrieben. Nichts besunderes nur ein Besucherzähler:

<?
$datei = fopen("besucher.txt","r");

$besucher = fgets($datei,255);
fclose($datei);

$besucher++;

$datei = fopen("besucher.txt","w");
fputs($datei,$besucher,255);
fclose($datei);

echo "Du bist der $besucher Besucher.\n";

?>

Seit gestern setzt sich diese Datei und die Datei besucher.txt von selbst auf 0 Byte, der Inhalt dieser Datein löscht sich beim Aufrufen.
An was kann das liegen? Ich habe in den zwei Monaten nichts geändert und auf einmal so was. Kann das am Provider liegen? Ist bei wem schon so was aufgetreten?
Danke für hilfe!

  1. Hallo Otto.

    Seit gestern setzt sich diese Datei und die Datei besucher.txt von selbst auf 0 Byte, der Inhalt dieser Datein löscht sich beim Aufrufen.

    Ich hatte das gleiche Problem, die Ursache war, dass die Kapazität meines Webspace erschöpft war. Nachdem ich ein paar Dateien gelöscht hatte, ging es wieder.

    Freundschaft!
    Siechfred

    --
    Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
    Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)
    ie:) fl:) br:? va:{ ls:? fo:§ rl:( n4:} ss:? de:µ js:{ ch:° sh:( mo:? zu:}
  2. <?
    $datei = fopen("besucher.txt","r");

    $besucher = fgets($datei,255);
    fclose($datei);

    $besucher++;

    $datei = fopen("besucher.txt","w");
    fputs($datei,$besucher,255);
    fclose($datei);

    echo "Du bist der $besucher Besucher.\n";

    ?>

    Das könnte an gleichzeitigen zugriffen liegen. Dann wird die Datei zurückgesetzt.
    So funzt es besser:
    <?
    $datei = fopen("besucher.txt","r");

    $besucher = fgets($datei,255);
    fclose($datei);

    $besucher++;

    $datei = fopen("besucher.txt","w");
    flock($datei,"2");  // Datei exclusiv öffnen
    fputs($datei,$besucher,255);
    flock($datei,"3"); // Datei wieder freigeben
    fclose($datei);

    echo "Du bist der $besucher Besucher.\n";

    ?>

    MfG

    --

    ie:{ fl:( br:^ va:} ls:[ fo:| rl:? n4:# ss:) de:] js:| ch:] mo:| zu:}
    1. Hello,

      <?
      $datei = fopen("besucher.txt","r");

      $besucher = fgets($datei,255);
      fclose($datei);

      $besucher++;

      $datei = fopen("besucher.txt","w");
      fputs($datei,$besucher,255);
      fclose($datei);

      echo "Du bist der $besucher Besucher.\n";

      ?>

      Das könnte an gleichzeitigen zugriffen liegen. Dann wird die Datei zurückgesetzt.
      So funzt es besser:

      Das "funzt" aber auch noch richtig, wenn "funzen" == "krachen" ist... ;-))

      <?
      $datei = fopen("besucher.txt","r");

      $besucher = fgets($datei,255);
      fclose($datei);

      $besucher++;

      $datei = fopen("besucher.txt","w");
      flock($datei,"2");  // Datei exclusiv öffnen
      fputs($datei,$besucher,255);
      flock($datei,"3"); // Datei wieder freigeben
      fclose($datei);

      echo "Du bist der $besucher Besucher.\n";

      ?>

      Wird Zeit. dass mein Artukel zum Locking fertig wird. Es ist nämlich falsch, was Du empfiehlst, obwol die Richtung schon passt.

      <?php  ### counter.php ###

      $dateihandle = fopen("besucher.txt","a+");    ## Datei zerstörungsfrei öffnen  oder anlegen

      if($dateihandle and flock($dateihandle))      ## wenn ein Handle erteilt wurde, wird solange
        {                                             ## gewartet, bis locked werden konnte
          $fseek($dateihandle,0,SEEK_SET);            ## Dateizeiger auf Anfang
          $besucher = intval(fgets($datei,255));      ## Typconvertierung in Ineteger des gelesenen Wertes
          $besucher++;                                ## incrementieren
          $fseek($dateihandle,0,SEEK_SET);            ## Dateizeiger auf Anfang
          fputs($dateihandle,$besucher);              ## zurückschreiben
          $ftruncate($dateihandle,strlen($besucher)); ## Dateilänge anpassen
          fclose($dateihandle);                       ## beim Close wird automatisch unlocked
        }
        else
        {
          mail("webnmaster@domain.tld","Fehler beim Counter","Der Coeunter konnt nicht zaehlen");
        }

      ?>

      Für eine Datenveränderung muss die Datei vor dem Leseprozess gesperrt werden und erst nach dem Schreibprozess wieder freigegeben werden.

      Das Truncate nach dem Schreiben ist wichtig, dass ggf. ünerhängende alte Inhalte gekürst werden.

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Wird Zeit. dass mein Artukel zum Locking fertig wird. Es ist nämlich falsch, was Du empfiehlst, obwol die Richtung schon passt.

        Ganz korrekt sieht deine Version aber auch nicht aus, meine wird so funktionieren im gegensatz zu deiner ;) Oder müssen funktionen jetzt in Variablen geschrieben werden?

        Das Truncate nach dem Schreiben ist wichtig, dass ggf. ünerhängende alte Inhalte gekürst werden.

        Aber nicht bei einem Counter, völlig unnötig bei einer Datei von wenigen bytes

        MfG

        --

        ie:{ fl:( br:^ va:} ls:[ fo:| rl:? n4:# ss:) de:] js:| ch:] mo:| zu:}
        1. Hello,

          Ganz korrekt sieht deine Version aber auch nicht aus, meine wird so funktionieren im gegensatz zu deiner ;) Oder müssen funktionen jetzt in Variablen geschrieben werden?

          Nein, natürlich nicht. da ist was verloren gegangen

          <?php  ### counter.php ###

          $dateihandle = fopen("besucher.txt","a+");       ## Datei zerstörungsfrei öffnen  oder anlegen

          if($dateihandle and flock($dateihandle,LOCK_EX)) ## wenn ein Handle erteilt wurde, wird solange
            {                                                ## gewartet, bis locked werden konnte
              $seek_ok = fseek($dateihandle,0,SEEK_SET);     ## Dateizeiger auf Anfang
              $besucher = intval(fgets($datei,255));         ## Typconvertierung in Ineteger des gelesenen Wertes
              $besucher++;                                   ## incrementieren
              $seek_ok = $fseek($dateihandle,0,SEEK_SET);    ## Dateizeiger auf Anfang
              fputs($dateihandle,$besucher);                 ## zurückschreiben
              $ftruncate($dateihandle,strlen($besucher));    ## Dateilänge anpassen
              fclose($dateihandle);                          ## beim Close wird automatisch unlocked
            }
            else
            {
              mail("webnmaster@domain.tld","Fehler beim Counter","Der Counter konnte nicht zaehlen");
            }

          ?>

          So sollte es jetzt richtig sein.
          Aenn ich auf Deine Version ein 'ab' ansetze, ist der Countertinhalt nach wenigen Sekunden hinüber.

          Das Truncate nach dem Schreiben ist wichtig, dass ggf. ünerhängende alte Inhalte gekürst werden.

          Aber nicht bei einem Counter, völlig unnötig bei einer Datei von wenigen bytes

          Was sabbelst Du da? Wenn man mit dem zerstörungsfreien Mode 'a+' arbeiten, muss das sein.
          Da die Datei nur eine einzige Variable enthält, darf da nichts mehr überschießen, sonst ist das Datenformat kaputt.

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          1. Hi,

            Das Truncate nach dem Schreiben ist wichtig, dass ggf. ünerhängende alte Inhalte gekürst werden.
            Aber nicht bei einem Counter, völlig unnötig bei einer Datei von wenigen bytes
            Was sabbelst Du da? Wenn man mit dem zerstörungsfreien Mode 'a+' arbeiten, muss das sein.
            Da die Datei nur eine einzige Variable enthält, darf da nichts mehr überschießen, sonst ist das Datenformat kaputt.

            Bei einem Counter, wo also nur eine Zahl in der Datei steht, die bei jedem erneuten Schreiben größer wird, also gleichlang bleibt oder länger wird, ist nichts vorhanden, was abzuschneiden wäre.

            cu,
            Andreas

            --
            MudGuard? Siehe http://www.Mud-Guard.de/
            Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
            1. Hello,

              Das Truncate nach dem Schreiben ist wichtig, dass ggf. ünerhängende alte Inhalte gekürst werden.
              Aber nicht bei einem Counter, völlig unnötig bei einer Datei von wenigen bytes
              Was sabbelst Du da? Wenn man mit dem zerstörungsfreien Mode 'a+' arbeiten, muss das sein.
              Da die Datei nur eine einzige Variable enthält, darf da nichts mehr überschießen, sonst ist das Datenformat kaputt.

              Bei einem Counter, wo also nur eine Zahl in der Datei steht, die bei jedem erneuten Schreiben größer wird, also gleichlang bleibt oder länger wird, ist nichts vorhanden, was abzuschneiden wäre.

              Wie kommst Du auf die Idee, dass alle diese Methode nur fürs Hochzählen nehmen? Könnte ja auch sein, dass jemand dekrementieren will. Außerdem weiß man ja auch nicht, unter welcher PHP-Version wieviel Zeichen für eine Zahl geschrieben werden. Zahlen werden bei PHP als Text in die Datei geschrieben. Und '00001' ist geleichbedeutend mit '1'.

              Eine saubere Programmierung setzt also die Formatkorrektur durch truncate() voraus.

              Harzliche Grüße aus http://www.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
              1. Hallo Tom,

                Wie kommst Du auf die Idee, dass alle diese Methode nur fürs
                Hochzählen nehmen? Könnte ja auch sein, dass jemand dekrementieren
                will. Außerdem weiß man ja auch nicht, unter welcher PHP-Version
                wieviel Zeichen für eine Zahl geschrieben werden. Zahlen werden
                bei PHP als Text in die Datei geschrieben. Und '00001' ist
                geleichbedeutend mit '1'.

                Nein, das haengt nur davon ab, wie du die Zahl repraesentierst. Siehe
                dazu auch

                http://de.php.net/pack

                Es ist problemlos moeglich, eine Zahl binaer in eine Datei zu
                schreiben.

                Grüße,
                 CK

                --
                Wenn gewöhnliche Menschen Wissen erlangen, sind sie weise. Wenn Weise Einsicht erlangen, sind sie gewöhlnliche Menschen.
                http://wwwtech.de/
                1. Hello,

                  Wie kommst Du auf die Idee, dass alle diese Methode nur fürs
                  Hochzählen nehmen? Könnte ja auch sein, dass jemand dekrementieren
                  will. Außerdem weiß man ja auch nicht, unter welcher PHP-Version
                  wieviel Zeichen für eine Zahl geschrieben werden. Zahlen werden
                  bei PHP als Text in die Datei geschrieben. Und '00001' ist
                  geleichbedeutend mit '1'.

                  Nein, das haengt nur davon ab, wie du die Zahl repraesentierst. Siehe
                  dazu auch

                  http://de.php.net/pack

                  Es ist problemlos moeglich, eine Zahl binaer in eine Datei zu
                  schreiben.

                  Wenn das hier gemacht worden wäre, hätte ich mich nicht geräuspert.
                  Hier wird aber die allgemeine textorientierte Schreibweise benutzt und nicht eine streng typorientierte (wie z.B. mit Pack() möglich).

                  Nun sei also so ehrlich und gibt zu, dass Du jetzt mit Kanonen auf mich schiessen wolltest, obwohl ich doch nur 'piep' gemacht habe.

                  Ich bemängele schon lange die schlechte (umständliche) Strukturunterstützung unter PHP. Zu pack() gibts hier bestimmt schon Threads von mir.

                  Schließlich kann man also nur wiederholen, dass für eine saubere Programmierung und textorientioerte Ausgabe von Werte in eine Datei diese reformatiert wrden muss nach der Wiederbenuzung (nach ist besser als vor, da die Datensicherheit im Chrashfall dadurch steigt)

                  Harzliche Grüße aus http://www.annerschbarrich.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau