stephan: Datei schreiben in Multiuser-Umgebung

hi,

ich habe zum ändern der Email Adresse in einem Passwort File, welches ich zum einloggen in meine Website verwende, folgendes Script erstellt:

function changeMail($username, $email) {
 $handle = fopen ("../data/usr", "r+");
 flock($handle,2);
 $buffer = '';
 while (!feof($handle)) {
  $zeile = fgets($handle);
  $x = explode("\t",$zeile);
  if($x[3]==$username) {
   $x[4]=$email;
   $buffer.=implode("\t",$x);
  } else $buffer.=$zeile;
 }
 rewind($handle);
 echo fwrite($handle,$buffer,strlen($buffer));
 flock($handle,3);
 fclose ($handle);
}

Meine Frage: Bietet dieses Script genug Schutz, dass die Passwort Datei jederzeit unversehrt bleibt? Beim Auslesen und Hinzufügen von Benutzern werde ich dann auch flock() etc. verwenden.

Ausserdem währe ich sehr froh, wenn mir mal jemand die Funktion flock() genau erklären könnte! Ich werde aus der Referenz auf php.net einfach nicht schlau! Z.B. verstehe ich nicht:
-was machen genau die verschiedenen Verriegelungsarten? (bedeutet jetzt "lesende Verriegelung" dass man noch lesen darf, genau das gegenteil? etc.)
-wie reagiert flock(), wenn eine Datei bereits gesperrt ist? wartet es? wenn ja, wie lange?
-wann genau gibt es false aus? (wenn die Datei gesperrt ist, oder falls sonst ein Fehler passiert?)

vielen Dank, für eure Hilfe!

  1. Sup!

    Steht das etwa nicht in der Doku?

    Gruesse,

    Bio

    --
    Never give up, never surrender!!!
    1. kann sein… aber ich werde leider aus der Dokumentation einfach nicht schlau!
      was z.B. ist "eine exklusive, nur schreibende Verriegelung"??
      oder: "Gibt bei Erfolg TRUE zurück, im Fehlerfall FALSE."
      was genau ist ein Fehler? auch wenn die Datei bereits gelesen wird??
      oder was bedeutet, dass die "Verriegelung sperrt"??

      http://ch2.php.net/manual/de/function.fwrite.php
      bestimmt eine der schlechteren Dokumentationen... ist auf der englischen Seite auch nicht besser. Vielleicht verstehe ich auch einfach noch zu wenig von Verriegelungen.

      doch in erster Linie geht es mir um die Tauglichkeit meines Scripts.

      trotzdem danke!

      1. Hallo stephan,

        kann sein… aber ich werde leider aus der Dokumentation einfach nicht schlau!
        was z.B. ist "eine exklusive, nur schreibende Verriegelung"??

        Es gibt zwei Arten von File-Locks:

        1. SHARED ("geteilt"): Hier können mehrere laufenden Programme gleichzeitig auf eine Datei zugreifen. Logischerweise geht das nur lesend.

        2. EXCLUSIVE ("ausschließlich/exklusiv"): Wenn ein Programm in die Datei schreiben will, dann braucht es einen exklusiven Lock. Nur so kann sichergestellt werden, dass ein anderes Programm, was die Datei ausliest, auch konsistente (also zu einem bestimmten Zeitpunkt gültige) Daten bekommt.

        Es ist also problemlos möglich, das mehrere PHP-Scripts mit flock($fh, LOCK_SH) auf eine Datei zugreifen. Sobald aber LOCK_EX benutzt wird, darf nur ein Script "gleichzeitig" auf die Datei zugreifen.

        oder: "Gibt bei Erfolg TRUE zurück, im Fehlerfall FALSE."
        was genau ist ein Fehler? auch wenn die Datei bereits gelesen wird??

        Fehlerfall heißt hier: Wenn flock() nicht erfolgreich war. Beispielsweise würde ein flock($fh, LOCK_EX) fehlschlagen, wenn die Datei schon von einem anderen Script mit flock() belegt ist. Dann liefert flock() FALSE zurück und dein Script sollte in dem Fall nicht auf die Datei zugreifen. Schreiben würde die Dateiinhalte zerstören, und beim Lesen könnte es fehlerhafte Daten aus der Datei bekommen.

        MffG
        EisFuX

        --
        Auch meine Hosenträger sind intelligent, in dem Sinne, dass man sie regulieren kann. Sie besitzen ein adaptives Verhalten.
        Stanisław Lem