Mit PHP Dateien schreiben
MP
- php
0 kati0 Achim Schrepfer0 MP0 Achim Schrepfer0 MP
0 ich
Hallo,
Beim Versuch einen einfachen Counter mit PHP zu programmieren (soll ohne MySQL sein) bin ich auf ein Problem gestoßen. Folgender Code funktioniert zwar bei mir auf dem Computer unter Win 2000 und OmniHTTPd als Server, aber nicht auf dem Unix-Server im Internet:
$fp = fopen("counter.txt", "w");
flock($fp, 2);
fputs($fp, join(",", $cdata));
flock($fp, 3);
fclose($fp);
Nun habe ich die Datei vorher angelegt und CHMOD = 666 mit WS_FTP gesetzt (alle Gruppen können die Datei lesen und schreiben). Nun tritt nicht gleich ein Fehler auf, aber geschrieben wird trotzdem nicht! Wo liegt das Problem?
MP
hallo MP,
also schau, ob sich die Datei in dem richtigen Verzeichnis befindet. Aber zuerst - nach dem Öffnen der Page - kontrolliere den Quellcode der generierten html-Datei (oder ist es php ?) direkt im Browser. Bzw. versuch eine if-schleife einzubauen und lass dir den Wert der Variablen mit javascript oder echo ausgeben... Was anderes fällt mir da gar nicht ein.
cu kati
Hallo,
Beim Versuch einen einfachen Counter mit PHP zu programmieren (soll ohne MySQL sein) bin ich auf ein Problem gestoßen. Folgender Code funktioniert zwar bei mir auf dem Computer unter Win 2000 und OmniHTTPd als Server, aber nicht auf dem Unix-Server im Internet:
$fp = fopen("counter.txt", "w");
flock($fp, 2);
fputs($fp, join(",", $cdata));
flock($fp, 3);
fclose($fp);
Nun habe ich die Datei vorher angelegt und CHMOD = 666 mit WS_FTP gesetzt (alle Gruppen können die Datei lesen und schreiben). Nun tritt nicht gleich ein Fehler auf, aber geschrieben wird trotzdem nicht! Wo liegt das Problem?
MP
Hallo MP,
$fp = fopen("counter.txt", "w");
flock($fp, 2);
fputs($fp, join(",", $cdata));
flock($fp, 3);
fclose($fp);
Nun habe ich die Datei vorher angelegt und CHMOD = 666 mit WS_FTP gesetzt (alle Gruppen können die Datei lesen und schreiben). Nun tritt nicht gleich ein Fehler auf, aber geschrieben wird trotzdem nicht! Wo liegt das Problem?
<php-doku>
flock() funktioniert nicht auf NFS und verschiedenen anderen vernetzten Dateisystemen. Für weitere Detail konsultieren Sie bitte Ihre Betriebssystemdokumentation.
Bei einigen Betriebssystemen ist flock() auf dem Prozesslevel implementiert. Wenn Sie ein multithreaded Server API wie ISAPI benutzen können Sie sich nicht auf flock() verlassen, um Dateien vor anderen PHP-Skripten zu schützen, welche in parallelen Threads der gleichen Server-Instanz laufen!
</php-doku>
Vielleicht liegt es an Deinem flock-Aufruf. Versuche mal, das Skript ohne flock() laufen zu lassen um den Fehler einzugrenzen.
viele Grüsse
Achim
Hi,
Danke für den Hinweis! Ohne flock funktioniert es tatsächlich einwandfrei.
MP
Hallo MP,
Danke für den Hinweis! Ohne flock funktioniert es tatsächlich einwandfrei.
bitteschön. Das ist allerdings nur die halbe Miete. Zwar kann ich Dir leider nicht sagen wie es _mit_ flock funktioniert, aber einen Lock-Mechanismus sollte man - wenigstens der Sauberkeit halber - schon einsetzen. Sonst kann es leicht passieren, dass Deine Counterzahlen verfälscht werden oder gar verloren gehen.
viele Grüsse
Achim Schrepfer
Hallo Achim,
Es ist mir schon klar, dass bei einem gleizeitigem Aufruf und einbischen Glück bzw. Unglück liest einer der gestarteten Scripte aus einer leeren Datei und setzt den Counterstand auf 1 zurück...
Doch welche Alternative gibt es denn? Vorher dachte ich mir eine temporäre Datei anzulegen und, wenn sie eine Eins enthält, heisst es, dass die Counterdatei gesperrt ist. Aber wenn man weiterdenkt, ist das keine Lösung, denn das gleiche Problem kann auch bei der Bearbeitung dieser Tempdatei entstehen...
MP
Hi MP,
Doch welche Alternative gibt es denn? Vorher dachte ich mir eine temporäre Datei anzulegen und, wenn sie eine Eins enthält, heisst es, dass die Counterdatei gesperrt ist. Aber wenn man weiterdenkt, ist das keine Lösung, denn das gleiche Problem kann auch bei der Bearbeitung dieser Tempdatei entstehen...
ich denke mal, wenn flock() gar nicht zum laufen zu bekommen ist, dann wäre der Aufwand mit Tempdateien etc. für einen Counter schon recht hoch. Wenn Du zunächst den Inhalt der Datei einliest, inkrementierst, und dann zurückschreibst (hier wichtig: Erfolgsprüfung), dann verlierst Du vielleicht mal einen Aufruf, aber der Inhalt der Datei dürfte nicht zerstört werden.
viele Grüsse
Achim
Hallo,
Tag!
$fp = fopen("counter.txt", "w");
Ich hab auch noch was - denn auch sowas kann schuld haben (Du hast ja keine Fehlerbeschreibung aus dem Log beigelegt)...:
fopen ("Pfad/Datei","w",0);
Die 0 ist ein false und besagt, das "Pfad/datei" nicht unterhalb des include Verzeichnises (in der php.ini einzustellen) zu suchen ist.