Пример счетчика
Давайте напоследок рассмотрим классический пример, когда без блокировки файла не обойтись. Если вы уже имели некоторый опыт в Web-программировании, то вы, наверное, уже догадываетесь, что речь пойдет о проблеме, возникающей при написании сценария счетчика.
Итак, нам нужен сценарий, который бы при каждом своем запуске увеличивал число, хранящееся в файле, и выводил его в браузер. Несложная, казалось бы, задача сильно осложняется тем, что при большой посещаемости сервера могут быть запущены сразу несколько процессов-счетчиков, которые попытаются обратиться к одному и тому же файлу. Если не принять мер, это приведет к тому, что счетчик рано или поздно "обнулится".
Далее следует сценарий, использующий блокировку для предотвращения указанной проблемы.
Листинг 15.4. Простейший текстовый счетчик
<?
$f=fopen("counter.dat","a+");
flock($f,LOCK_EX); // Говорим, что дальше будем работать только мы
$count=fread($f,100); // Читаем значение, сохраненное в файле
@$count=$count+1; // Увеличиваем его на 1 (пустая строка = 0)
ftruncate($f,0); // Стираем файл
fwrite($f,$count); // Записываем новое значение
fflush($f); // Сбрасываем файловый буфер
flock($f,LOCK_UN); // Отключаемся от блокировки
fclose($f); // Закрываем файл
echo $count; // Печатаем величину счетчика
?>
Здесь мы применяем только исключительную блокировку, потому что каждый раз, когда нам нужно вывести на экран счетчик, его также нужно и увеличить.