Start · Sprachen · PHP · Referenz · wincache_unlock

wincache_unlock

Funktion

Gibt eine zuvor mit <code>wincache_lock()</code> erworbene exklusive Sperre für einen angegebenen Schlüssel frei.

seit PHP 1.1.0 Kategorie: misc

Signatur

wincache_unlock(string $key): bool

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

Typ
bool
Beschreibung
Gibt 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 erfolgreich freigegeben. Aktueller Zähler: 1

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.';
    }
}
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.