Ce face stream_supports_lock
Blocarea cu flock funcționează la fișierele obișnuite de pe disc, dar nu la stream-uri din memorie, socket-uri sau adrese web. stream_supports_lock îți spune dinainte dacă blocarea are sens.
Parametri
| Parametru | Descriere |
|---|---|
$stream |
Stream-ul verificat. |
Ce returnează
true dacă stream-ul suportă flock, altfel false.
Exemple
Exemplul 1: Fișier, memorie și socket
<?php
$fisier = fopen("contor.txt", "w");
$memorie = fopen("php://memory", "r+");
[$socket] = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
var_dump(stream_supports_lock($fisier));
var_dump(stream_supports_lock($memorie));
var_dump(stream_supports_lock($socket));
Rezultat
bool(true)
bool(false)
bool(false)
Exemplul 2: Blochează doar când se poate
<?php
function scrie_sigur($f, string $text): void
{
$blocat = stream_supports_lock($f) && flock($f, LOCK_EX);
fwrite($f, $text);
if ($blocat) {
flock($f, LOCK_UN);
}
echo $blocat ? "scris cu blocare\n" : "scris fără blocare\n";
}
scrie_sigur(fopen("comenzi.log", "a"), "comanda 101\n");
scrie_sigur(fopen("php://memory", "r+"), "comanda 102\n");
Rezultat
scris cu blocare
scris fără blocare
Greșeli frecvente
- Apelezi
flockpe un stream care nu suportă blocare și nu verifici rezultatul.flockreturneazăfalse, iar scrierile simultane nu sunt protejate.
Comenzi înrudite
flock: Blochează un fișier ca două scripturi să nu îl modifice în același timp.fopen / fclose: Deschide un fișier pentru citire sau scriere și returnează o resursă; fclose îl închide.