Sven Rautenberg: Datei organisisert sperren

Beitrag lesen

Moin!

jetzt musst Du aber einen Stein fallen hören haben...

Hast Du den Doku-Fehler gemeldet?

Man kann diskutieren, ob das Entsperren der Datei (bzw. von Bereichen einer Datei - Filelocking geht ja zumindest OS-seitig auch auf Byteranges) explizit stattfinden sollte.

Grundsätzlich muss man es ja irgendwie hinkriegen, eine Datei zu öffnen, ein Lock zu erhalten, dann Änderungen in die Datei zu schreiben und vor Lösen des Locks diese Änderungen zu persistieren. Und die Lösung ist recht simpel: fflush() schreibt alle Puffer auf die Platte. Danach kann man problemlos flock(LOCK_UN) aufrufen und fclose().

Der Grund, warum man das manuell machen will: Manche Betriebssysteme lösen das Lock nicht sofort beim fclose(), sondern ggf. später beim Aufräumen geschlossener Filehandles - Windows wäre so ein Kandidat. Insofern kann man sich ohne explizite Lock-Freigabe schön ins Knie schießen.

Weiterhin ist genau das vermutlich auch der Grund, warum das Freigeben des Locks bei fclose() rausgeflogen ist: Im Prinzip schreibt das Dateischließen alle Puffer auf die Platte. Die PHP-Implementierung hat aber im Prinzip innerhalb der Funktion fclose() einfach nur flock(LOCK_UN) aufgerufen, und erst danach wäre durch Dateischließen das Flush implizit erfolgt. Mithin besteht also die Chance, dass durch diese Race-Condition Dateiinhalt verloren geht.

Insofern sollte man festhalten:

fopen();  
flock(LOCK_EX);  
  
fwrite();  
  
fflush();  
flock(LOCK_UN);  
fclose();  

- Sven Rautenberg