Signatur
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
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);
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);
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);
// 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.