2013-12-08 5 views
5

Ich studiere den Flock-Mechanismus in PHP und es fällt mir schwer, die Funktionsweise des LOCK_SH-Modus zu verstehen. Ich lese auf einer Website, dass es die Datei sperrt, so dass andere Skripts nicht schreiben können, aber sie können davon lesen. Doch der folgende Code offenbar nicht wie erwartet funktionieren: In file1.php ich habe:Wie funktioniert LOCK_SH?

$fp = fopen('my_file.txt','r'); 

flock($fp, LOCK_SH); 
sleep(20); 
flock($fp, LOCK_UN); 

Und in file2.php habe ich

$fp = fopen('my_file.txt','a'); 
fwrite($fp,'test'); 

ich das erste Skript ausführen, die die Datei sperrt für 20 Sekunden. Wenn die Sperre gesetzt ist, führe ich file2.php aus, was die Ausführung sofort beendet und nachdem ich 'my_file.txt' geöffnet habe, wurde der String 'test' angehängt (obwohl 'file1.php' immer noch lief). Ich versuche, 'file2.php' so zu ändern, dass es ohne Probleme aus der gesperrten Datei lesen und daraus rot wird. So anscheinend ... die 'LOCK_SH' scheint nichts zu tun. Wenn ich jedoch LOCK_EX ja verwende, sperrt es die Datei, kein Skript kann aus der Datei schreiben oder lesen. Ich verwende Easy PHP und führe es unter Windows 7 aus.

Antwort

4

flock() implementiert Advisory-Locking, nicht obligatorische Sperrung. Damit file2.php durch das Schloss file1.php blockiert werden kann, muss es versuchen, eine Schreib (LOCK_EX) Sperre für die Datei vor dem Schreiben zu erwerben.

+0

verstehe ich. Ich habe den Mechanismus, den du erklärt hast, getestet und es hat ohne Probleme funktioniert. Du bist der Beste. –

14

LOCK_SH bedeutet SHARED LOCK. Eine beliebige Anzahl von Prozessen kann gleichzeitig LOCK freigegeben haben. Es wird allgemein als Lesersperre bezeichnet.

LOCK_EX bedeutet EXKLUSIVES SPERREN. Nur ein einzelner Prozess kann eine exklusive Sperre für eine bestimmte Datei zu einem Zeitpunkt besitzen.

Wenn die Datei in einem anderen Prozess mit LOCK_SH GESPERRT wurde, wird FLOCK mit LOCK_SH ERFOLGREICH. Herde mit LOCK_EX BLOCKIEREN BIS ALLE LÖSCHER LÖSCHEN FREIGEGEBEN. Jetzt

http://php.net/manual/en/function.flock.php#78318

+0

wow wie hast du diesen Kommentar von vor 10 Jahren gefunden: D? Danke SHER_LOCK – Adam