Tom: file-locking um konkurrierende Datei-Zugriffe zu regeln?

Beitrag lesen

Hello Andreas,

hoffe ich auch ,-) Das hat mich erstmal erschlagen. Deshalb auch keine Reaktion bis jetzt. Ich brauch noch Zeit zum Probieren. Aber eins verstehe ich nicht: Auch in der Doku steht was, daß die Prozesse die gleichen Regeln beachten müssen oder so. Wie stelle ich das denn fest? Also bei mir greifen nicht verschiedene Programme auf eine Datei zu, sondern das eine Script eben von verschiedenen Clients angefordert.

Alle Filezugriffe werden (gottseidank) immer noch über das Betriebsystem abgewickelt. Das Betriebssystem führt dazu eine Handletabelle. Bei Multiuser-Systemen ist die schon ganz schön komplex und irgendwo in der Grundkonfiguration des Systems kann man daher auch oft einstellen, wieviele Handles maximal vergeben werden dürfen. Zu guten alten DOS-Zeiten war das die Einstellung FILES. Bei DOS wurde diese Tabelle auch noch statisch bereitgehalten. Spätere Betriebssytemen haben dann die Tabelle bereits dynamisch geführt; i.d.R. ist sie heute eine verkettete Liste.

Nun hat man für das advisory Locking nicht die Originaltabelle verändert, sondern einfach eine zweite daneben gebaut, die nur das Handle aus der ersten übernimmt und sich dazu die Lockingstufe merkt und welcher Prozess sie beantragt hat. Du kannst unter PHP ja auch die PID abfragen. Wenn Du  nun ein Script baust, das die PID  und den Status einer Datei (das Ergebnis eines LOCK-Versuches) mit Hilfe von flush() auf dem Client ausgibt und dann noch eine Weile weiterläuft (sleep()) dann kannst Du das Script über ein zweites Fenster Deines Browsers j anochmal aufrufen. Es wird dann eine andere PID haben und dir sicher melden, dass die Datei zur Zeit z.B. EXCLUSIV gesperrt ist, oder nur ein LOCK_SH möglich ist (dann besteht schon ein LOCK_SH eines anderen Prozesses).

Mach doch einfach mal ein paar solcher Versuche.

lokale Handletabelle         zentrale Lockingtabelle
            1 -----------+               1
            2            |               2
            3            +----+-->-->--->3   PID  filePtr  openmode SH
                              +--------->3   PID  filePtr  openmode SH
                              |  +------>4
                              |  |       5
                              |  |      ...
   lokale handletabelle       |  |
            1-----------------+  |
            2--------------------+
            3

Wenn in der Liste für die Datei (3) schon ein Eitrag besteht mit LOCK_SH, kann kein _anderer_ Prozess einen mit LOCK_EX bekommen. Wenn schon ein Eintrag mit LOCK_EX besteht, kann kein _anderer_ Prozess einen Eintrag bekommen.

Liebe Grüße aus http://www.braunschweig.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau