nochmal File-locking
Andreas-Lindig
- programmiertechnik
Hallo Forum,
Ich habe mir die Datei <...> von Tom runtergeladen, aber bei mir funktioniert sie nicht so wirklich. Habe auch versucht, den locking-Erfolg zu testen, in dem ich eine Verzögerung mit sleep() eingebaut habe und das Script von zwei verschiedenen Instanzen aufgerufen habe, aber beide haben unbeirrt die angeblich schon gelockte Datei nochmal gelockt. Scheint mir nicht wirklich erfolgversprechend. Es sei denn, Tom würde mir nochmal helfen. Da Script glaube ich einigermaßen verstanden zu haben.
Ich hatte jetzt noch eine Idee:
Jeder Prozess, der auf eine Datei zugreifen will, bekommt eine eindeutige ID - ähnlich einer SessionID oder in meinem Falle der Username des registrierten Benutzers. Bevor er auf die Hauptdatei zugreift öffnet er eine locking-Datei, kuckt, ob sie leer ist, wenn ja schreibt er seine ID da rein und geht zur Hauptdatei weiter: öffnen, auslesen, Daten ändern, und jetzt: VOR dem Zurückschreiben kuckt er nochmal in die locking-Datei, ob seine eigene ID da drin steht oder eine andere. Wenn eine andere drin steht, schreibt er die Hauptdatei nicht und fängt von vorn an. Das wäre der Fall, wenn zwei Prozesse die locking-Datei gleichzeitig offen hatten und der zweite den ersten überschrieben hat. Ansonsten schreibt der Prozess die Hauptdatei und leert danach die locking-Datei wieder.
Also Konfliktbeispiel:
Prozess 1 Prozess 2 Status
========= ========= ======
+-> liest lock-Datei
| |
+-- steht was drin
|
| liest lock-Datei
|
S schreibt ID 1
C schreibt ID 2 in der lock-Datei steht ID 2
H
L liest Hauptdatei
E ändert Daten
I
F liest Hauptdatei
E ändert Daten
|
| liest lock-Datei
| | |
+-- findet ID 2 |
| liest lock-Datei
| |
findet ID 1 <-+ findet ID 2
| |
| schreibt Hauptdatei in Hauptdatei stehen Daten von Prozess 2
| leert lock-Datei lock-Datei ist frei für nächsten Prozess
|
schreibt Hauptdatei in Hauptdatei stehen Daten von Prozess 1
leert lock-Datei lock-Datei ist frei für nächsten Prozess
In der Schleife ist immer eine Wartezeit, damit der andere Prozess seine Sache zu ende führen kann. Im Extremfall würden die zwei sich immer gegenseitig stören, indem Prozess 1 zum wiederholten Mal ID 1 in die Lockdatei schreibt _bevor_ Prozess 2 diese zum zweiten Mal ausliest, danach wird er dann zum Prozess 1 (Schleife) u.s.w. Man würde die Anzahl der Durchgänge begrenzen und in diesem GAU-Fall eine Fehlerseite zurückgeben, mit der Aufforderung, die Anfrage zu wiederholen.
Ist das gut oder schlecht?
Gruß, Andreas
kleiner Nachtrag, der Link zu Toms Script:
http://selfhtml.bitworks.de/speichern.php
Gruß, Andreas