Ich habe dieses kleine Skript es
header('Content-type:text/plain; charset=utf-8');
$dir = dirname(__FILE__);
$file = $dir.'/testflock.lock';
$fh = fopen($file, 'w+');
$unlocked = flock($fh, LOCK_EX | LOCK_NB);
echo 'Locked: '.$file.' ';var_dump(!$unlocked);echo PHP_EOL;
if($unlocked){
sleep(10);
throw new Exception();
}
zu testen und für mich dauerte es das Betriebssystem die Datei ca. 2-5 Sekunden zu entsperren, nachdem das Skript ausgeführt wird beendet, wenn es keine Ausnahme wirft, und bis zu 2-5 Sekunden nach dem Stoppen des Skripts wegen der ausgelösten Exception.
Denken Sie daran, dass ab php 5.3.2 fclose($fh)
wird nicht die Datei entsperren, und die Datei bleibt gesperrt, es sei denn, Sie entsperren es mit PHP oder Sie müssen warten, bis das Betriebssystem es entsperren, die möglicherweise nie passieren wenn es einige Fehler ist (dies mir passiert)
um die Datei zu entsperren:
flock($fh,LOCK_UN);
um den Datei-Handle zu schließen (wird automatisch aufgerufen, wenn das Skript ausgeführt wurde)
fclose($fh);
Wenn Sie die Datei ohne die Datei LOCK_NB
sperren, wartet das Skript darauf, dass die Datei entsperrt wird.
Dies sollte einfach genug sein, um zu testen. Beginne etwas, das lange läuft, töte es und schau was passiert? – Brad
Ja, natürlich. Wenn eine permanente Ressource ihren Host-Prozess überleben würde, wäre das eine Sicherheitslücke, da sie das System sogar als unprivilegierter Benutzer verwenden könnte. – phihag