Start · Sprachen · PHP · Referenz · stream_supports_lock

stream_supports_lock

Funktion

Prüft, ob ein gegebener Stream das Sperren (<code>flock()</code>) unterstützt, und gibt entsprechend <code>true</code> oder <code>false</code> zurück.

seit PHP 5.3.0 Kategorie: io

Signatur

stream_supports_lock(resource $stream): bool

Beschreibung

stream_supports_lock() ermittelt, ob der übergebene Stream-Ressource das Sperren mittels flock() unterstützt. Nicht alle Streams unterstützen Dateisperren — während lokale Dateisysteme dies in der Regel tun, unterstützen Netzwerk-Streams oder spezielle Wrapper wie php://memory diese Funktion möglicherweise nicht.

Diese Funktion ist besonders nützlich, wenn Code mit verschiedenen Stream-Typen umgehen muss und bevor eine Sperre gesetzt wird geprüft werden soll, ob der jeweilige Stream das Sperren überhaupt unterstützt. So lassen sich unnötige Fehler oder unerwartetes Verhalten vermeiden.

Intern fragt die Funktion den Stream-Wrapper ab, ob er das STREAM_LOCK_SUPPORTED-Flag gesetzt hat. Eigene Stream-Wrapper können dieses Verhalten über die Methode stream_lock() im Wrapper-Objekt steuern.

Die Funktion ist besonders hilfreich beim Einsatz in Bibliotheken oder Frameworks, die mit abstrakten Stream-Ressourcen arbeiten und portablen, fehlertoleranten Code liefern müssen.

Parameter

Name Typ Default Beschreibung
$stream Pflicht resource Eine geöffnete Stream-Ressource, die mit Funktionen wie fopen(), fsockopen() oder ähnlichen erzeugt wurde und auf Sperr-Unterstützung geprüft werden soll.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Stream Dateisperren über flock() unterstützt, andernfalls false.

Beispiele

Prüfen, ob eine lokale Datei gesperrt werden kann

<?php
$file = fopen('/tmp/beispiel.txt', 'w+');

if (stream_supports_lock($file)) {
    if (flock($file, LOCK_EX)) {
        fwrite($file, 'Gesperrter Schreibzugriff');
        flock($file, LOCK_UN);
        echo 'Datei erfolgreich gesperrt und beschrieben.';
    }
} else {
    echo 'Dieser Stream unterstützt keine Sperren.';
}

fclose($file);
Datei erfolgreich gesperrt und beschrieben.

Unterschied zwischen lokalem Stream und Memory-Stream

<?php
$localFile = fopen('/tmp/local.txt', 'w+');
$memStream = fopen('php://memory', 'r+');

echo 'Lokale Datei unterstützt Sperren: ';
echo stream_supports_lock($localFile) ? 'Ja' : 'Nein';
echo PHP_EOL;

echo 'Memory-Stream unterstützt Sperren: ';
echo stream_supports_lock($memStream) ? 'Ja' : 'Nein';
echo PHP_EOL;

fclose($localFile);
fclose($memStream);
Lokale Datei unterstützt Sperren: Ja Memory-Stream unterstützt Sperren: Nein

Verwendung in einer generischen Schreib-Hilfsfunktion

<?php
function sicherSchreiben(resource $stream, string $data): bool {
    if (stream_supports_lock($stream)) {
        if (!flock($stream, LOCK_EX)) {
            return false;
        }
    }

    fwrite($stream, $data);

    if (stream_supports_lock($stream)) {
        flock($stream, LOCK_UN);
    }

    return true;
}

$fh = fopen('/tmp/output.txt', 'a');
$ergebnis = sicherSchreiben($fh, 'Neue Zeile' . PHP_EOL);
echo $ergebnis ? 'Schreiben erfolgreich.' : 'Schreiben fehlgeschlagen.';
fclose($fh);
Schreiben erfolgreich.

// Wichtig · Fallstricke

Hinweis zu benutzerdefinierten Stream-Wrappern: Eigene Wrapper, die mit stream_wrapper_register() registriert wurden, unterstützen Sperren nur, wenn die Methode stream_lock() im Wrapper implementiert ist. Andernfalls liefert stream_supports_lock() für solche Streams false.

Netzwerk-Streams: Streams, die über Netzwerkprotokolle (z. B. HTTP, FTP) geöffnet werden, unterstützen in der Regel keine Dateisperren. Das Ergebnis kann je nach Betriebssystem und Konfiguration variieren.

Portabilität: Auf Windows kann das Sperrverhalten bei Netzlaufwerken unzuverlässig sein. Es empfiehlt sich, stream_supports_lock() als zusätzliche Absicherung vor dem Einsatz von flock() zu verwenden.