flock
(PHP 4, PHP 5)
flock — Portables Datei-Sperr-Verfahren (advisory locking)
Beschreibung
bool flock
( resource $handle
, int $operation
[, int &$wouldblock
] )
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
(auf nicht-Windows Systemen) mit der LOCK_NB Option,
dokumentiert unten, gesteuert werden.
Parameter-Liste
-
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 (wird
nicht unter Windows unterstützt).
-
wouldblock
-
Das optionale dritte Argument ist auf TRUE gesetzt, falls das Sperren
blockierte (EWOULDBLOCK Fehler Nummer). (wird nicht unter Windows
unterstützt)
Rückgabewerte
Gibt bei Erfolg TRUE zurück. Im Fehlerfall wird FALSE zurückgegeben.
Beispiele
Beispiel #1 flock() Beispiel
<?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");
flock($fp, LOCK_UN); // Gib Sperre frei
} else {
echo "Konnte Sperre nicht erhalten!";
}
fclose($fp);
?>
Beispiel #2 flock() Nutzung der LOCK_NB Option
<?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);
?>
Anmerkungen
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() System Aufruf 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.
Warnung
Weisst man dem handle Argument einen anderen Wert
zu, wird nachfolgender Code die Sperre lösen.
Warnung
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 antiquierten Dateisystemen wie
FAT und dessen Derivate nicht unterstützt, und gibt
deshalb in solchen Umgebungen immer FALSE zurück (Dies ist speziell
bei Windows 98 Benutzern der Fall).