Christian Seiler: Sperren von Dateien

Beitrag lesen

Hallo Tom,

(Ich kann es z.Zt. nur mit PHP4 ausprobieren, und das ist ja witzlos, denn da wurde
definitv totzdem gewartet, auch wenn extra NonBlocking gewünscht wurde.)

Sorry, aber das kann ich mir nicht vorstellen. Wie hast Du das denn getestet?

Folgender Testcase: Erste PHP-Datei:

<?php  
  
$fp = dio_open ('file.txt', O_WRONLY | O_CREAT, 0666);  
var_dump ($fp);  
$res = dio_fcntl ($fp, F_SETLKW, array ('start' => 0, 'length' => 0, 'whence' => SEEK_SET, 'type' => F_WRLCK));  
var_dump ($res);  
sleep (20);  
dio_close ($fp);  
  
?>

Zweite PHP-Datei:

<?php  
  
$fp = fopen ('file.txt', 'r+');  
var_dump ($fp);  
$res = flock ($fp, LOCK_EX);  
var_dump ($res);  
fclose ($fp);  
  
$fp = fopen ('file.txt', 'r+');  
var_dump ($fp);  
$res = flock ($fp, LOCK_EX | LOCK_NB);  
var_dump ($res);  
fclose ($fp);  
  
?>

Erste führst Du in einem Fenster auf, da sollte folgende Ausgabe erscheinen:

resource(4) of type (Direct I/O File Descriptor)
int(0)

(1. Zeile auf jeden Fall resource(X) und zweite Zeile auf jeden Fall int(0))

Zweite führst du während die erste noch schläft in einem zweiten Fenster aus, dann sollte sowas rauskommen:

resource(5) of type (stream)
bool(true)
resource(6) of type (stream)
bool(true)

(1. und 3. Zeile auf jeden Fall resource(X) und zweite und vierte Zeile auf jeden Fall bool(true)!)

Und das zweite Script sollte sich SOFORT beenden, d.h. auf GAR NICHTS warten.

Eben weil beide Lock-Typen (fcntl(2) und flock(2)) vollkommen unterschiedlich sind und nichts miteinander zu tun haben.

Der EINZIGE Fall, in dem auch nur IRGENDETWAS warten könnte, wäre, wenn Du Mandatory Locks aktiviert hast, d.h. das Dateisystem mit -o mand gemountet hast und das SetGid-Bid bei deaktiviertem Group-Executable-Bit der betroffenen Datei aktiviert hast - das allerdings auch nicht bei diesem Beispiel (das die Datei nur zum Lesen öffnet), sondern dann bei konkreten Lese- und Schreibvorgängen.

Viele Grüße,
Christian