flock
(PHP 4, PHP 5)
flock – leichte Empfehlung zum Sperren von Dateien
Beschreibung
bool flock ( int $handle , int $operation [, int &$wouldblock ] )
PHP unterstützt eine einfache Methode zum Sperren aller Dateien auf beratende Weise (das heißt, alle zugreifenden Programme müssen auf die gleiche Weise gesperrt werden, sonst funktioniert es nicht).
Hinweis:
flock() wird unter Windows erzwungen.
Das Handle der flock()-Operation muss ein Zeiger auf eine offene Datei sein. operation kann einer der folgenden Werte sein:
Um eine gemeinsame Sperre (Leseprogramm) zu erhalten, setzen Sie operation auf LOCK_SH (in Versionen vor PHP 4.0.1 auf 1 gesetzt).
Um eine exklusive Sperre (Schreibprogramm) zu erhalten, setzen Sie operation auf LOCK_EX (in Versionen vor PHP 4.0.1 auf 2 gesetzt).
Um eine Sperre (ob gemeinsam oder exklusiv) aufzuheben, setzen Sie Operation auf LOCK_UN (in Versionen vor PHP 4.0.1 auf 3 gesetzt).
Wenn Sie nicht möchten, dass flock() blockiert, wenn es gesperrt ist, fügen Sie LOCK_NB zur Operation hinzu (in Versionen vor PHP 4.0.1 auf 4 gesetzt).
flock() ermöglicht die Implementierung eines einfachen Lese-/Schreibmodells, das auf jeder Plattform (einschließlich der meisten Unix-Derivate und sogar Windows) verwendet werden kann. Der optionale dritte Parameter wird auf TRUE gesetzt, wenn die Sperre blockieren würde (im Falle des EWOULDBLOCK-Fehlercodes). Der Sperrvorgang kann auch durch fclose() aufgehoben werden (wird auch automatisch aufgerufen, wenn die Codeausführung abgeschlossen ist).
Gibt TRUE bei Erfolg zurück, oder FALSE bei Misserfolg
Beispiel #1 flock() Beispiel
$fp = fopen("/tmp/lock.txt", "w+"
if (flock($fp, LOCK_EX)) { // exklusive Sperre ausführen
fwrite($fp, "Schreibe hier etwas"); // Sperre aufheben
} else {
echo „Die Datei konnte nicht gesperrt werden!“;
fclose($fp>?>) >
Da flock() einen Dateizeiger erfordert, müssen Sie möglicherweise eine spezielle Sperrdatei verwenden, um den Zugriff auf Dateien zu schützen, die im Schreibmodus geöffnet werden sollen (fügen Sie „w“ oder „w+“ zur fopen()-Funktion hinzu). .
Warnung
flock() kann nicht mit NFS und einigen anderen Netzwerkdateisystemen verwendet werden. Weitere Informationen finden Sie in der Dokumentation Ihres Betriebssystems.
In einigen Betriebssystemen wird flock() auf Prozessebene implementiert. Bei Verwendung einer Multithread-Server-API (z. B. ISAPI) ist es möglicherweise nicht möglich, sich zum Schutz der Datei auf flock() zu verlassen, da die Datei von PHP-Skripten verarbeitet werden kann, die in anderen parallelen Threads in derselben Serverinstanz ausgeführt werden.
flock() unterstützt keine älteren Dateisysteme wie FAT und seine Derivate. Daher wird in dieser Umgebung immer FALSE zurückgegeben (insbesondere für Windows 98-Benutzer).
Einführung in die Verwendung der Dateisperrfunktion Flock-Funktion in PHP:
Syntax:
bool flock (int $handle, int $operation [, int & $wouldblock ] )
Das Handle der flock()-Operation muss ein Zeiger auf eine offene Datei sein. operation kann einer der folgenden Werte sein:
1. Um eine gemeinsame Sperre (Leser) zu erhalten, setzen Sie operation auf LOCK_SH (in Versionen vor PHP 4.0.1 auf 1 gesetzt)
2, um eine exklusive Sperre zu erhalten (Writer), setze Operation auf LOCK_EX (in Versionen vor PHP 4.0.1 auf 2 gesetzt) 3. Um die Sperre aufzuheben (ob gemeinsam genutzt oder exklusiv), setze Operation auf LOCK_UN (in Versionen vor PHP 4.0.1). auf 3 in der Version)
4. Wenn Sie nicht möchten, dass flock() blockiert, wenn es gesperrt ist, fügen Sie LOCK_NB zur Operation hinzu (in Versionen vor PHP 4.0.1 auf 4 gesetzt)
Siehe unten Code:
a.php
Code kopieren
Der Code lautet wie folgt:
sleep(10);
fwrite($fp, "123");
}
fclose($ fp);
?>
b.php
Code kopieren
Der Code lautet wie folgt:
$file = "temp.txt" $fp = fopen($file, 'r'); echo fread($fp, 100); fclose($fp>?>
Nachdem Sie a.php ausgeführt haben, führen Sie sofort b.php aus und Sie können die Ausgabe sehen:
abc
Warten Sie, bis die Ausführung von a.php abgeschlossen ist, und führen Sie b.php aus, und Sie können die Ausgabe sehen:
abc
123
Wenn a.php eine Datei schreibt, sind die Daten offensichtlich zu groß und es dauert zu lange, bis b.php unvollständige Daten liest Ändern Sie b.php in:
php
$file = " temp.txt";
$fp = fopen($file, 'r');
if(flock($fp, LOCK_EX)) {
echo fread($ fp, 100);
flock($fp, LOCK_UN); sonst{
echo „Datei sperren fehlgeschlagen...“; >?>
Führen Sie nach dem Ausführen von a.php sofort b.php aus. Sie können feststellen, dass b.php wartet, bis a.php abgeschlossen ist (d. h. nach 10 Sekunden), bevor es angezeigt wird :
abc
123
Lesen Die Daten sind vollständig, aber die Zeit ist zu lang. Er muss warten, bis die Schreibsperre aufgehoben wird, bevor er Änderungen an b.php vornimmt.
Ändern Sie b.php wie folgt:
Kopieren Sie den Code
Der Code lautet wie folgt: php $file = "temp.txt"; $fp = fopen($file, 'r'); 🎜>echo fread ($fp, 100);
flock ($fp, LOCK_UN); else{ echo „Datei sperren fehlgeschlagen…“;
fclose ($fp );
?>
Nachdem Sie a.php ausgeführt haben, führen Sie sofort b.php aus und Sie können die Ausgabe sehen:
Sperrdatei fehlgeschlagen…
Beweisen Sie, dass die Sperrdatei Der Fehlerstatus kann anstelle von „Es dauert lange zu warten“ zurückgegeben werden, wie oben beschrieben.
Fazit des Herausgebers von Script House:
Es wird empfohlen, beim Zwischenspeichern von Dateien relevante Sperren auszuwählen, da es sonst zu unvollständigem Lesen oder wiederholtem Schreiben von Daten kommen kann.
file_get_contents kann die Sperre anscheinend nicht auswählen. Ich weiß nicht, welche Sperre standardmäßig verwendet wird. Die Ausgabe, die durch Nichtsperren erzielt wird, ist jedoch dieselbe wie bei unvollständigen Daten.