САМОУЧИТЕЛЬ PHP 4




Исключительная блокировка


Вернемся к нашему примеру с процессами-писателями. Каждый такой процесс страстно желает, чтобы в некоторый момент (точнее, когда он уже почти готов начать писать) он был единственным, кому разрешена запись в файл.

Он хочет стать исключительным.

Отсюда и название блокировки, которую процесс должен для себя установить. Вызвав функцию flock($f,LOCK_EX), он может быть абсолютно уверен, что все остальные процессы не начнут без разрешения писать в файл, пока он не выполнит все свои действия и не вызовет flock($f, LOCK_UN) или не закроет файл.

Откуда такая уверенность? Дело в том, что если в данный момент наш процесс не единственный претендент на запись, операционная система просто не выпустит его из "внутренностей"

функции flock(), т. е. не допустит его продолжения, пока процесс-писатель не станет единственным. Момент, когда процесс, использующий исключительную блокировку, становится активным, знаменателен еще и тем, что все остальные процессы-писатели ожидают (все в той же функции flock()), когда же он, наконец, закончит свою работу с файлом. Как только это произойдет, операционная система выберет следующий исключительный процесс, и т. д.

Что ж, давайте теперь рассмотрим, как в общем случае должен быть устроен процесс-писатель, желающий установить для себя исключительную блокировку (листинг 15.2).

Листинг 15.2. Модель процесса с исключительной блокировкой

<?

// инициализация

// . . .

$f=fopen($f,"a+") or die("Не могу открыть файл на запись!");

flock($f,LOCK_EX); // ждем, пока мы не станем единственными

// В этой точке мы можем быть уверены, что только эта

// программа работает с файлом

// . . .

fflush($f);        // записываем все изменения на диск

flock($f,LOCK_UN); // говорим, что мы больше не будем работать с файлом

fclose($f);

// Завершение

// . . .

?>

Заметьте, что при открытии файла мы использовали не деструктивный режим w (который удаляет файл, если он существовал), а более "мягкий" — a+.




Содержание  Назад  Вперед