Locks

bool flock ( resource $handle , int $operation [, int &$wouldblock ] )

  • Позволяет осуществить простую модель чтения/записи, которая может быть использована практически на любой платформе (включая большинство вариантов Unix и даже Windows).

В версиях PHP до 5.3.2 блокировка освобождалась также вызовом функции fclose() (которая также вызывается автоматически по завершении скрипта).

PHP поддерживает портируемый способ консультативной блокировки (adviosory locking) полностью всего файла (что означает, что все программы, осуществляющие доступ к файлу, должны использовать один и тот же способ блокировки, иначе блокировка не будет работать). По умолчанию, данная функция будет ждать получения блокировки; это поведение можно изменить с помощью описанного ниже параметра LOCK_NB.

operation может принимать следующие значения:

  • LOCK_SH для получения разделяемой блокировки (чтение).
  • LOCK_EX для получения эксклюзивной блокировки (запись).
  • LOCK_UN для снятия блокировки (разделяемой или эксклюзивной).

Также возможно добавить константу LOCK_NB в качестве битовой маски к любой из вышеуказанных операций, если вы не хотите ждать пока flock() получит блокировку.

<?php

$fp = fopen("/tmp/lock.txt", "r+");

if (flock($fp, LOCK_EX)) { // выполняем эксклюзивную блокировку
    ftruncate($fp, 0); // очищаем файл
    fwrite($fp, "Что-нибудь пишем сюда\n");
    fflush($fp);        // очищаем вывод перед отменой блокировки
    flock($fp, LOCK_UN); // отпираем файл
} else {
    echo "Не удалось получить блокировку !";
}

fclose($fp);

?>