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

       

Пример счетчика


Давайте напоследок рассмотрим классический пример, когда без блокировки файла не обойтись. Если вы уже имели некоторый опыт в 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;          // Печатаем величину счетчика

?>

Здесь мы применяем только исключительную блокировку, потому что каждый раз, когда нам нужно вывести на экран счетчик, его также нужно и увеличить.



Содержание раздела