Datei setzt sich von selbst auf 0 Byte
Otto 2
- php
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!
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
<?
$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
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
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
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
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
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
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
Es ist problemlos moeglich, eine Zahl binaer in eine Datei zu
schreiben.
Grüße,
CK
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 auchEs 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