Leider hab ich noch keine befriedigende Loesung gefunden. Aber
es wurde auch von anderen Ideen erzaehlt, wie z.B. rename oder
lock. Kann man mir da noch mehr darueber erzaehlen?
Der Hintergrund nochmal: Eine Datei, die nicht von aussen
lesbar und beschreibar ist, sondern nur vom PHP-Skript aus.
Also: Es gibt drei Möglichkeiten.
- Du legst Du ein neues Verzeichnis an und gibst ihm die Rechte ‚lesen‘, ‚schreiben‘ und ‚ausführen‘ (777). In dieses Verzeichnis schreibt dein PHP-Script die Datei.
Nachteil: Die Datei kann natürlich von außen per Webbrowser gelesen werden, sobald der name des Verzeichnisses und der Name der Datei bekannt ist. Das Verzeichnis sollte also per htaccess-Datei mit einem Passwort versehen werden.
- Du schreibst in ein temporäres Verzeichnis wie /tmp. Dort darf jeder Dateien anlegen. Da das Verzeichnis außerhalb der DocumentRoot des Servers liegt, kann man mit einem Webbrowser nicht mehr darauf zugreifen.
Nachteil: Jeder kann im /tmp-Verzeichnis die Datei lesen, sobald der Name bekannt ist. Je nachdem, wie der Server konfiguriert ist, kann es aber auch sein, dass du ein eigenes /tmp-Verzeichnis hast, in dem nur du lesen und schreiben darfst - keine Ahnung, kenne Deine Umgebung nicht.
- Du bittest den Admin deines Servers, die Datei, in die Du schreiben willst, dem User ‚nobody‘ zu zuweisen (chown nobody meinedatei.txt).
Nachteil: Du kannst per FTP nicht mehr darauf zugreifen, da Dir diese Datei nicht mehr gehört. Weiterhin kann jeder per Webbrowser auf diese Datei zugreifen, wenn ihr Name bekannt ist.
Mit Lösung 1+2+3 kann man nun mit chmod die Rechte der Datei ändern, so wie Du es anfangs vor hattest. Mit Lösung 1+2 kann man eine rename-Lösung bauen.
Immer, wenn Du in die Datei schreiben willst, nennst Du sie um (rename „meinedatei.txt“, „meinedatei.neu“, schreibst hinein und nennst sie wieder um (rename „meinedatei.neu“, „meinedatei.txt“. Damit verhinderst Du, dass zwei Prozesse gleichzeitig in die Datei schreiben können.
Mit Lösung 1 kannst Du eine lock-Datei-Lösung bauen. Dazu legst Du vor dem Schreiben in ‚meinedatei.txt‘ eine lock-Datei an, beispielsweise ‚meinedatei.lock‘. Dann schreibst Du in deine Datei ‚meinedatei.txt‘ hinein und löscht nach dem Schreiben die lock-Datei ‚meinedatei.lock‘. Dein Programm prüft nun immer nach, ob ‚meinedatei.lock‘ existiert. Wenn nein, dann darf geschrieben werden. Andernfalls passiert nichts.
Könnte etwa so aussehen:
if (!file\_exists("meinverzeichnis/meinedatei.lock")) {
touch("meinverzeichnis/meinedatei.lock");
$fp=fopen("meinverzeichnis/meinedatei.txt","r");
fputs irgendwas;
fclose($fp);
unlink("meinverzeichnis/meinedatei.lock");
}
Nix davon ist getestet, sondern gerade mal so aus meinem Kopf gekommen.
Stefan