Tom: Inhalte von Dateien austauschen

Beitrag lesen

Hello,

Ich wollte fragen, wie man das hier am besten löst:
In einer PHP-Datei steht ein Array

$schmeckt={"Bier","Sekt","Wein"}

Das ist aber ein String, wenn das dort so drinsteht.

Wenn ein Array drinstehen würde, hätte ich es zumindest serialisiert.

Im Folgenden lasse ich die Fehlerkontrollen weg, weise aber darauf hin, dass diese
notwendig sind. Wenn man die Blöcke zu Funktionen vervollständigt kann man sie leicht
einbauen!

Erzeugen:
  $_schmeckt = array{"Bier","Sekt","Wein"};   ## Array erzeugen
  $stream = serialize($_schmeckt);            ## Stream daraus machen
  $fh = fopen($dateiname, 'w+');              ## Datei öffen
  flock ($fh, LOCK_EX);                       ## Datei sperren
  frite($fh, $stream);                        ## Datei schreiben
  fclose($fh);                                ## Datei schließen und entsperren

Austauschen:
  $fh1 = fopen($dateiname, 'a');              ## Datei erzeugen, falls nicht vorhanden
  flock ($fh1, LOCK_SH);                      ## Datei mit Sperre gegen Schreibsperre belegen
  $fh2 = fopen($dateiname, 'r+');             ## Datei zum Lesen und Schreiben öffnen
  flock ($fh2, LOCK_SH);                      ## Ebenfalls Sperre gegen Schreibsperre setzen
  fclose($fh1);                               ## ggf. neu erzeugte Datei frei geben (schließen)
  flock ($fh2, LOCK_EX);                      ## Sperre auf Schreibsperre 'upgraden'
  $fsize = filesize($dateiname);              ## Dateigröße holen
  $stream = fread($fh2, $fsize);              ## Datei auslesen
  $_schmeckt = unserialize($stream);          ## Stream in Array zurückverwandeln
  ### Manipulationen am Array durchführen     ## Hier das Array verändern
  $stream = serialize($_schmeckt);            ## Array wieder in Stream umwandeln
  fseek($fh2, 0, SEEK_SET);                   ## Datensatzzeiger zurück auf Anfang
  fwrite($fh2,$stream);                       ## verändertes Array wegschreiben
  ftruncate($fh, strlen($strem));             ## Dateilänge anpassen auf veränderten Inhalt
  fclose($fh);                                ## Datei schließen und freigeben.

Solange ein Dateihandle ein LOCK_SH hält, kann kein anderes ein LOCK_EX erhalten, aber beliebig viele sich zusätzlich auf das LOCK_SH aufschalten. LOCK_SH ist also eine Sperre gegen die Schreibsperre. Wenn ein Dateihandle als einziges ein LOCK_SH hält, kann es diese zum LOCK_EX (also zur vollwertigen Sperre) erweitern.

Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)