ProfiPHPProfiPHP
Категория: Функции для работы с файловой системой

Функция Flock

Функция Flock осуществляет портируемую консультативную блокировку файлов.
bool flock( resource $handle, int $operation [, int &$wouldblock ] )
Функция Flock позволяет осуществить простую модель чтения/записи, которая может быть использована практически на любой платформе (включая большинство вариантов Unix и даже Windows).

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

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

Параметр Handle являет собой указатель (resource) на файл, обычно создаваемый с помощью функции Fopen.

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

LOCK_SH для получения разделяемой блокировки (чтение).

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

LOCK_UN для снятия блокировки (разделяемой или эксклюзивной).

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

Необязательный параметр Wouldblock будет установлен в 1, если блокировка будет блокирующей (код ошибки EWOULDBLOCK).

Функция Flock возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
Пример использования:
$f = fopen( $file, 'a+' );
flock( $f, LOCK_EX );
// Программа, которая выполняет операцию с файлом
flock( $f, LOCK_UN );
fclose( $f );

$f = fopen( $file, 'r' );
flock( $f, LOCK_SH );
// Здесь мы уверены, что в файл никто не пишет
flock( $f, LOCK_UN );
fclose( $f );
В Windows функция Flock использует обязательную (mandatory) блокировку вместо консультативной. Обязательная блокировка также поддерживается на Linux и операционных системах, основанных на System V с помощью стандартного механизма, который предоставляет системный вызов fcntl(): т.е. искомый файл должен иметь установленный бит доступа setgid и неустановленный бит группового выполнения. Для корректной работы этой схемы в Linux, файловая система также должна быть смонтирована с опцией mand.

Из-за того, что функции Flock необходим указатель на файл, вам может понадобиться воспользоваться специальным запирающим файлом для того, чтобы ограничить доступ к файлу, который вы намерены очищать, путём его открытия в режиме записи (используя "w" или "w+" в качестве аргумента функции Fopen).

Присвоение другого значения аргументу Handle в последующем коде отменит существующую блокировку.

Функция Flock не поддерживается на старых файловых системах вроде FAT и ее производных, так что всегда будет возвращать FALSE в этом окружении.

Добавить комментарий

Имя:
Текст комментария: