(PHP 4, PHP 5, PHP 7)
flock — Portables Datei-Sperr-Verfahren (advisory locking)
$handle
, int $operation
[, int &$wouldblock
] ) : boolflock() erlaubt ihnen, ein einfaches Leser-/Schreiber-Modell umzusetzen, was auf nahezu jeder Platform (inklusive der meisten Unix Abkömmlinge und sogar Windows) genutzt werden kann.
Unter PHP-Versionen vor 5.3.2, wurde die Sperre auch von fclose() gelöst (was auch automatisch aufgerufen wird, wenn das Skript endet).
PHP unterstützt eine portable Art komplette Dateien "beratend" zu sperren
(was bedeutet, dass alle zugreifenden Programme das gleiche Sperrverfahren
nutzen müssen, oder die Sperre wird nicht wirken). Standardmäßig wird diese
Funktion blockieren, bis die angefragte Sperre erlangt wurde; dies kann
mit der Option LOCK_NB
,
dokumentiert unten, gesteuert werden.
handle
Eine Dateisystemressource (resource), wie sie in der Regel von fopen() zurückgegeben wird.
operation
operation
ist einer der Folgenden Werte:
LOCK_SH
um eine geteilte Sperre (Leser) zu
erhalten.
LOCK_EX
um eine exklusive Sperre (Schreiber) zu
erhalten.
LOCK_UN
um eine Sperre zu lösen (geteilt oder
exklusiv).
Man kann auch LOCK_NB
als Bitmaske zu einer der
obigen Operationen hinzufügen, falls man nicht möchte,
dass flock() während der Sperrens blockiert.
wouldblock
Das optionale dritte Argument ist auf 1 gesetzt, falls das Sperren blockierte (EWOULDBLOCK-Fehlernummer).
Gibt bei Erfolg TRUE
zurück. Im Fehlerfall wird FALSE
zurückgegeben.
Version | Beschreibung |
---|---|
5.5.22, 5.6.6 |
Unterstützung für den wouldblock -Parameter unter
Windows hinzugefügt.
|
5.3.2 | Das automatische Entsperren, wenn das Ressourcen-Handle der Datei geschlossen wurde, wurde entfernt. Entsperren muss nun immer manuell ausgeführt werden. |
Beispiel #1 Einfache, exklusive Sperre
<?php
$fp = fopen("/tmp/lock.txt", "r+");
if (flock($fp, LOCK_EX)) { // exklusive Sperre
ftruncate($fp, 0); // kürze Datei
fwrite($fp, "Write something here\n");
fflush($fp); // leere Ausgabepuffer bevor die Sperre frei gegeben wird
flock($fp, LOCK_UN); // Gib Sperre frei
} else {
echo "Konnte Sperre nicht erhalten!";
}
fclose($fp);
?>
Beispiel #2 Verwendung von LOCK_NB
<?php
$fp = fopen('/tmp/lock.txt', 'r+');
/* Aktiviere die LOCK_NB-Option bei einer LOCK_EX-Operation */
if(!flock($fp, LOCK_EX | LOCK_NB)) {
echo 'Kann Sperre nicht erhalten';
exit(-1);
}
/* ... */
fclose($fp);
?>
Hinweis:
flock() nutzt "verbindliche" (mandatory) anstatt "beratende" (advisory) Sperren unter Windows. "Verbindliches" Sperren wird auch unter Linux und System-V-basierten Betriebssystemen, durch den üblichen Mechanismus, der von dem fcntl()-Systemaufruf geliefert wird, unterstützt: das heißt, falls bei der fraglichen Datei das setgid-Zugriffs-Bit gesetzt ist und das Ausführungs-Bit für Gruppen null ist. Unter Linux muss das Dateisystem zusätzlich mit der Mount-Option mand eingebunden sein, damit dies Auswirkungen hat.
Hinweis:
Da flock() einen Dateizeiger benötigt, müssen Sie unter Umständen eine spezielle Sperrdatei benutzen, um den Zugriff auf eine Datei zu schützen, welche Sie mittels Öffnen im Schreibmodus (mit dem Argument "w" or "w+" von fopen()) kürzen wollen.
Hinweis:
Kann nur mit Dateizeigern verwendet werden, die von fopen() für lokale Dateien zurückgegeben wurden oder mit Dateizeigern, die auf Nutzer-Modus Streams zeigen, die die streamWrapper::stream_lock() Methode implementieren.
Weist man dem handle
Argument einen anderen Wert
zu, wird nachfolgender Code die Sperre lösen.
Bei einigen Betriebssystemen ist flock() auf dem Prozesslevel implementiert. Wenn Sie ein Multithreaded-Server-API wie ISAPI benutzen, können Sie sich nicht auf flock() verlassen, um Dateien vor anderen PHP-Skripten zu schützen, welche in parallelen Threads der gleichen Server-Instanz laufen!
flock() wird von antiquierten Dateisystemen wie
FAT und dessen Derivaten nicht unterstützt, und gibt
deshalb in solchen Umgebungen immer FALSE
zurück.