Описание
bool flock
( resource $handle
, int $operation
[, int &$wouldblock
] )
PHP поддерживает портируемый механизм запирания файлов целиком,
который имеет рекомендательный характер (это означает, что все
обращающиеся к файлу программы должны использовать такой же
способ запирания файла, иначе запирание не сработает).
Замечание:
flock() является обязательным под Windows.
flock() применяется к handle
,
который должен быть указателем на открытый файл.
Параметр operation
может принимать следующие
значения:
-
Чтобы установить общее запирание (чтение), установите
operation
в значение
LOCK_SH (или 1, в случае версии PHP ниже 4.0.1).
-
Чтобы установить эксклюзивное запирание (запись), установите
operation
в значение
LOCK_EX (или 2, в случае версии PHP ниже 4.0.1).
-
Чтобы отпереть файл (после общего или эксклюзивного запирания),
установите operation
в значение
LOCK_UN (или 3, в случае версии PHP ниже 4.0.1).
-
Если вы не хотите, чтобы flock() блокировал
файл при запирании, добавьте LOCK_NB
(или 4, при использовании версии PHP ниже 4.0.1) к параметру
operation
.
flock() позволяет вам реализовывать простую модель
чтения/записи, которая может быть использована практически на любой
платформе (включая большинство проивзодных от Unix платформ, и даже
Windows). Необязательный третий аргумент устанавливается в TRUE,
если запирание также блокирует (код ошибки EWOULDBLOCK). Блокировка
снимается при помощи этой же функции fclose()
(которая также автоматически вызывается при завершении выполнения
скрипта).
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
Пример #1 Пример использования функции flock()
<?php
$fp = fopen("/tmp/lock.txt", "w+");
if (flock($fp, LOCK_EX)) { // выполнить эксплюзивное запирание
fwrite($fp, "Что-нибудь пишем\n");
flock($fp, LOCK_UN); // отпираем файл
} else {
echo "Не могу запереть файл !";
}
fclose($fp);
?>
Замечание:
Из-за того, что функции flock() необходим указатель
на файл, вам может понадобиться воспользоваться специальным запирающим
файлом для того, чтобы ограничить доступ к файлу, который вы намерены
очищать путём открытыя его в режиме записи (используя "w" или "w+" в
качестве аргумента функции fopen()).
Внимание
flock() не будет работать на NFS и многих других
сетевых файловых системах. Обратитесь к документации вашей операционной
системы для получения дополнительной информации.
В некоторых операционных системах flock() реализован
на уровне процессов. При использовании многопоточных серверных API,
таких как ISAPI, вы не можете полагаться на flock()
для защиты ваших файлов от дугих PHP-скриптов, которые
работают в параллельном потоке на том же сервере!
flock() не поддерживается на старых файловых системах
вроде FAT и его производных, так что всегда будет
возвращать FALSE в этом окружении (это особенно касается пользователей
Windows 98).