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;