(PHP 4, PHP 5)
flock — Портируемая консультативная блокировка файлов
$handle
, int $operation
[, int &$wouldblock
] )flock() позволяет осуществить простую модель чтения/записи, которая может быть использована практически на любой платформе (включая большинство вариантов Unix и даже Windows).
В версиях PHP до 5.3.2 блокировка освобождалась также вызовом функции fclose() (которая также вызывается автоматически по завершении скрипта).
PHP поддерживает портируемый способ консультативной блокировки
(adviosory locking) полностью всего файла (что означает, что
все программы, осуществляющие доступ к файлу, должны использовать
один и тот же способ блокировки, иначе блокировка не будет
работать). По умолчанию, данная функция будет ждать получения
блокировки; это поведение можно изменить (на платформах отличных
от Windows) с помощью описанного ниже параметра LOCK_NB
.
handle
Указатель (resource) на файл, обычно создаваемый с помощью функции fopen().
operation
operation
может принимать следующие значения:
LOCK_SH
для получения разделяемой блокировки (чтение).
LOCK_EX
для получения эксклюзивной блокировки (запись).
LOCK_UN
для снятия блокировки (разделяемой или эксклюзивной).
Также возможно добавить константу LOCK_NB
в качестве битовой маски к любой из вышеуказанных операций,
если вы не хотите ждать пока flock()
получит блокировку. (не поддерживается в Windows)
wouldblock
Необязательный третий параметр будет установлен в TRUE
,
если блокировка будет блокирующей
(код ошибки EWOULDBLOCK). (не поддерживается на Windows)
Возвращает TRUE
в случае успешного завершения или FALSE
в случае возникновения ошибки.
Версия | Описание |
---|---|
5.3.2 | Автоматическое снятие блокировки при закрытии было удалено. Снятие блокировки теперь всегда должно осуществляться вручную. |
4.0.1 |
Добавлены константы LOCK_XXX. Ранее необходимо
было использовать 1 вместо LOCK_SH , 2 вместо
LOCK_EX , 3 вместо LOCK_UN и
4 вместо LOCK_NB
|
Пример #1 Пример использования функции 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);
?>
Пример #2 Использование flock() с параметром LOCK_NB
<?php
$fp = fopen('/tmp/lock.txt', 'r+');
/* Включаем параметр LOCK_NB в операции LOCK_EX */
if(!flock($fp, LOCK_EX | LOCK_NB)) {
echo 'Не удалось получить блокировку';
exit(-1);
}
/* ... */
fclose($fp);
?>
Замечание:
В Windows flock() использует обязательную (mandatory) блокировку вместо консультативной. Обязательная блокировка также поддерживается на Linux и операционных системах, основанных на System V с помощью стандартного механизма, который предоставляет системный вызов fcntl(): т.е. искомый файл должен иметь установленный бит доступа setgid и неустановленный бит группового выполнения. Для корректной работы этой схемы в Linux, файловая система также должна быть смонтирована с опцией mand.
Замечание:
Из-за того, что функции flock() необходим указатель на файл, вам может понадобиться воспользоваться специальным запирающим файлом для того, чтобы ограничить доступ к файлу, который вы намерены очищать, путём его открытия в режиме записи (используя "w" или "w+" в качестве аргумента функции fopen()).
Замечание:
Может быть использована только на дескрипторах локальных файлов, возвращенных функцией fopen(), или файловых дескрипторах пользовательских потоков, реализующих метод streamWrapper::stream_lock().
Присвоение другого значения аргументу handle
в
последующем коде отменит существующую блокировку.
В некоторых операционных системах flock() реализован на уровне процессов. При использовании многопоточных серверных API, таких как ISAPI, вы не можете полагаться на flock() для защиты ваших файлов от других PHP-скриптов, которые работают в параллельном потоке на том же сервере!
flock() не поддерживается на старых файловых системах
вроде FAT и ее производных, так что всегда будет
возвращать FALSE
в этом окружении (это особенно касается пользователей
Windows 98).