PHP
Referenzliste
flock
Dateisystem-Funktionen
Befehl:
bool flock ( resource $handle , int $operation [, int &$wouldblock ] )
Parameter-Liste:
Beschreibung | |
---|---|
Eine Dateisystemressource (resource), wie sie in der Regel von fopen() zurückgegeben wird. | |
operation ist einer der Folgenden Werte:
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). | |
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. Beschreibung:
flock() erlaubt ihnen, ein einfaches Leser/Schreiber Modell umzusetzen, was auf nahezu jeder Platform (inklusive der meisten Unix Abkömmlinge und sogar Winows) 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ässig 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.
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).
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ässig 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.
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).
Aktiv in Version:
(PHP 4, PHP 5, PHP 7)
Hinweis:
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 heisst, 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.
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.
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:
Warnung:
Weisst 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 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).flock() - Beispiel:
Eingabe:
<?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); ?>
Beschreibung:
Beschreibung | |
---|---|
5.3.2 | Das automatische Entsperren, wenn das Ressource handle der Datei geschlossen wurde, wurde entfernt. Entsperren muss nun immer manuell ausgeführt werden. |
4.0.1 | Die LOCK_XXX Konstanten wurden hinzugefügt. Zuvor mussten sie 1 für LOCK_SH , 2 für LOCK_EX , 3 für LOCK_UN und 4 für LOCK_NB nutzen. |
flock() - Beispiel 2: Nutzung der LOCK_NB Option
Eingabe:
<?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); ?>
Beschreibung:
Beschreibung | |
---|---|
5.3.2 | Das automatische Entsperren, wenn das Ressource handle der Datei geschlossen wurde, wurde entfernt. Entsperren muss nun immer manuell ausgeführt werden. |
4.0.1 | Die LOCK_XXX Konstanten wurden hinzugefügt. Zuvor mussten sie 1 für LOCK_SH , 2 für LOCK_EX , 3 für LOCK_UN und 4 für LOCK_NB nutzen. |
flock() - Beispiel 3:
Eingabe:
<?PHP //Inhalt der Datei counter.txt: 52369 $zaehler_anmelden = 'counter.txt'; $fp = fopen ( $zaehler_anmelden, 'r' ); $zahl = fgets ( $fp, 10 ); fclose ( $fp ); $zahl++; $fp = fopen ( $zaehler_anmelden, 'w' ); flock ( $fp, 2 ); fputs ( $fp, $zahl ); flock ( $fp, 3 ); fclose( $fp ); echo $zahl; ?>
Ausgabe:
52370
Beschreibung:
Beschreibung | |
---|---|
5.3.2 | Das automatische Entsperren, wenn das Ressource handle der Datei geschlossen wurde, wurde entfernt. Entsperren muss nun immer manuell ausgeführt werden. |
4.0.1 | Die LOCK_XXX Konstanten wurden hinzugefügt. Zuvor mussten sie 1 für LOCK_SH , 2 für LOCK_EX , 3 für LOCK_UN und 4 für LOCK_NB nutzen. |
Dateisystem-Funktionen