flock
funkcja
Zakłada doradcze blokady na plik, by uniknąć równoczesnego zapisu z kilku procesów. Zwraca true przy sukcesie.
flock(resource $stream, int $operation, int &$would_block = null): bool
flock implementuje doradcze blokowanie pliku (ang. advisory locking). Blokada działa tylko wtedy, gdy każdy proces korzystający z pliku sam wywołuje flock. Najważniejsze stałe operacji:
| Stała | Znaczenie |
|-------|-----------|
| LOCK_SH | blokada współdzielona (odczyt) |
| LOCK_EX | blokada wyłączna (zapis) |
| LOCK_UN | zwolnienie blokady |
| LOCK_NB | nie blokuj procesu (bitwise OR z powyższymi) |
Zawsze zwalniaj blokadę przez LOCK_UN przed fclose. Trzeci parametr $would_block (przekazany przez referencję) przyjmuje wartość 1, jeśli wywołanie z LOCK_NB nie mogłoby uzyskać blokady.
<?php
declare(strict_types=1);
$uchwyt = fopen(__DIR__ . '/licznik.txt', 'c+');
if ($uchwyt === false) {
exit('Nie można otworzyć pliku.');
}
if (!flock($uchwyt, LOCK_EX)) {
fclose($uchwyt);
exit('Nie można uzyskać blokady.');
}
$wartosc = (int) fgets($uchwyt);
$wartosc++;
ftruncate($uchwyt, 0);
rewind($uchwyt);
fwrite($uchwyt, (string) $wartosc);
flock($uchwyt, LOCK_UN);
fclose($uchwyt);
echo 'Licznik: ' . $wartosc . PHP_EOL;