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).