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?
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. –
@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. –
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. –