Возможно, вам на ум пришла аналогия с перекрестком, по одной дороге которого движется почти непрерывный поток машин, и поперечное движение при этом блокируется навсегда, — так что у водителей нет никаких шансов пробиться через сплошной поток. В реальном мире это действительно иногда происходит (потому-то любой светофор всегда представляет собой исключительную блокировку), но только не в мире PHP. Дело в том, что, если почти всегда активна разделяемая блокировка, операционная система все равно так распределяет кванты времени, что в некоторые из них можно "включить" исключительную блокировку. То есть "поток машин" становится не сплошным, а с "пробелами" — ровно такого размера, чтобы в них могли "прошмыгнуть" машины, едущие в перпендикулярном направлении.
В листинге 15.3 представлена модель процесса, использующего разделяемую блокировку.
Листинг 15.3. Модель процесса с разделяемой блокировкой
<?
// инициализация
// . . .
$f=fopen($f,"r") or die("Не могу открыть файл на чтение!");
flock($f,LOCK_SH); // ждем, когда процессы-писатели угомонятся
// В этой точке мы можем быть уверены, что эта программа работает
// с файлом, когда ни одна другая программа в него не пишет
// . . .
flock($f,LOCK_UN); // говорим, что мы больше не будем работать с файлом
fclose($f);
// Завершение
// . . .
?>
[E72] Устанавливайте разделяемую блокировку, когда вы собираетесь только читать из файла, не изменяя его. Всегда используйте при этом режим открытия r, и никакой другой. Снимайте блокировку так рано, как только сможете.