2012-03-25 22 views
7

Ich habe eine Datei, in die ich schreibe, aber ich muss sie zuerst sperren (mit flock()), um zu verhindern, dass andere Skripte darauf schreiben. So habe ich:Überprüfen Sie, ob eine Datei bereits mit flock() gesperrt wurde.

$file=fopen($file_p); 

if (flock($file, LOCK_EX)) {//lock was successful 
    fwrite($file,$write_contents);   
} 

Aber ich muss überprüfen, ob es bereits gesperrt ist, zu anderen Skripten zu verhindern, um es zu schreiben.

Wie kann ich das tun?

Antwort

-1

ich überprüfen würde, um zu sehen, ob ich nicht eine Sperre auf der Datei erhalten könnte, wie dies:

if (!flock($file, LOCK_EX)) { 
    throw new Exception(sprintf('Unable to obtain lock on file: %s', $file)); 
} 

fwrite($file, $write_contents); 
+1

Das ist falsch. Wenn Sie die 'LOCK_NB' Bitmaske für die an flock übergebene Operation nicht angeben, wird * diese Funktion standardmäßig blockieren, bis die angeforderte Sperre erreicht ist. * ([Quelle] (http://www.php.net/) Handbuch/de/function.flock.php)). Mit dem Beispielcode, den Sie angegeben haben, wird 'flock' * nicht * false zurückgeben, um anzuzeigen, dass die Datei von einem anderen Prozess gesperrt wurde, sondern einfach warten, bis dieser Prozess seine Sperre aufhebt. –

+0

@MarkAmery: Falsch wie? Die Logik ist einfach. Wenn Sie für die Datei keine Exklusivsperre erhalten, werfen Sie die Ausnahme. Es liegt an dem aufrufenden Code, herauszufinden, wie die Ausnahme behandelt wird. –

+0

Nein - falls der Grund dafür, dass die Sperre nicht aufgehoben werden kann, darin besteht, dass ein anderer Prozess sie enthält, stimmt Ihr Kommentar nicht mit dem Verhalten Ihres Codes überein. Stattdessen ist das Verhalten, das Ihr Code hat, "Wenn Sie keine exklusive Sperre für die Datei erhalten können, warten Sie, bis Sie können, und fahren Sie fort." - Dies ist das Standardverhalten von 'flock'. Sie müssen den Modifizierer 'LOCK_NB' verwenden, wie in der Antwort von Ryan Y gezeigt, damit sich Ihr Code so verhält, wie er in Ihrem Kommentar beschrieben wird. –

-1

Ihr Flockruf ist der Haken, um zu sehen, ob er bereits gesperrt ist. Wenn es gesperrt ist, dass, wenn() Anweisung fehlschlagen würde, so könnte man einfach ein anderes auf sich mit so etwas wie werfen:

if (flock($file, LOCK_EX)) {//lock was successful 
    fwrite($file,$write_contents); 
} else { 
    echo "$file is locked."; 
} 
+0

AHHH, also gibt es false zurück, wenn die Datei bereits gesperrt ist? –

+1

Das ist falsch; Sehen Sie meinen Kommentar zu Mike Purcells ziemlich identischer Antwort. –

14

Wie in den docs beschrieben, LOCK_NB verwenden, um einen nicht-blockierenden Versuch zu machen, die Sperre, und bei einem Fehler überprüft $wouldblock Argument zu erhalten, um zu sehen, ob etwas anderes die Sperre hält.

if (!flock($fp, LOCK_EX|LOCK_NB, $wouldblock)) { 
    if ($wouldblock) { 
     // something already has a lock 
    } 
    else { 
     // couldn't lock for some other reason 
    } 
} 
else { 
    // lock obtained 
} 
Verwandte Themen