Signatur
Beschreibung
wincache_unlock() hebt eine exklusive Sperre auf, die zuvor über wincache_lock() für denselben Schlüssel gesetzt wurde. Die Funktion wird zusammen mit wincache_lock() eingesetzt, um kritische Abschnitte in PHP-Skripten abzusichern, die auf gemeinsam genutzten Ressourcen (z. B. WinCache-Benutzer-Cache-Einträgen) operieren.
Ein typischer Anwendungsfall ist das sichere Lesen-Modifizieren-Schreiben eines Cache-Wertes: Zuerst wird die Sperre mit wincache_lock() erworben, dann wird der Wert gelesen, verändert und zurückgeschrieben, anschließend wird die Sperre mit wincache_unlock() wieder freigegeben. Ohne eine solche Sperre könnten parallele Anfragen denselben Wert gleichzeitig lesen und überschreiben, was zu Race Conditions führt.
Die Funktion steht ausschließlich auf Windows-Systemen zur Verfügung, auf denen die WinCache-PHP-Erweiterung installiert und aktiviert ist. Auf anderen Betriebssystemen ist sie nicht verfügbar.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $key Pflicht | string | Der Name des Schlüssels, für den die Sperre freigegeben werden soll. Muss mit dem Schlüssel übereinstimmen, der beim vorherigen Aufruf von wincache_lock() verwendet wurde. |
Rückgabewert
true zurück, wenn die Sperre erfolgreich freigegeben wurde, andernfalls false.Beispiele
Atomares Lesen-Modifizieren-Schreiben eines Cache-Zählers
<?php
$key = 'seitenaufrufe';
// Exklusive Sperre erwerben
if (wincache_lock($key)) {
// Aktuellen Wert lesen
$wert = wincache_ucache_get($key);
if ($wert === false) {
$wert = 0;
}
// Wert inkrementieren und zurückschreiben
$wert++;
wincache_ucache_set($key, $wert);
// Sperre freigeben
if (wincache_unlock($key)) {
echo 'Sperre erfolgreich freigegeben. Aktueller Zähler: ' . $wert;
} else {
echo 'Fehler beim Freigeben der Sperre.';
}
} else {
echo 'Sperre konnte nicht erworben werden.';
}
Sperre in einem try-finally-Block sicher freigeben
<?php
$key = 'kritischer_bereich';
if (wincache_lock($key)) {
try {
// Kritischen Abschnitt ausführen
$daten = wincache_ucache_get($key . '_daten');
// ... Daten verarbeiten ...
wincache_ucache_set($key . '_daten', $daten);
} finally {
// Sperre immer freigeben, auch bei Ausnahmen
wincache_unlock($key);
echo 'Sperre wurde freigegeben.';
}
}
// Wichtig · Fallstricke
Wichtig: Die Sperre sollte immer so kurz wie möglich gehalten werden, um Deadlocks oder übermäßige Wartezeiten bei anderen Anfragen zu vermeiden. Empfehlenswert ist die Verwendung eines try-finally-Blocks, um sicherzustellen, dass wincache_unlock() auch im Fehlerfall aufgerufen wird.
Deadlock-Gefahr: Wenn ein Skript beendet wird, ohne wincache_unlock() aufzurufen, kann die Sperre je nach WinCache-Konfiguration bestehen bleiben und andere Prozesse blockieren.
Die Funktion ist ausschließlich unter Windows mit der WinCache-Erweiterung verfügbar und hat auf anderen Plattformen keine Entsprechung.