Задача 2. Как написать счетчик посещений.
“Напиши мне простой счетчик посещений” – сказал мне мой “наставник” и вышел из аськи. Все это похоже на то, как учат детей плавать. Берут за руки и за ноги и кидают в воду. А дальше – хоть тони, хоть плыви. Я сначала подумал, что это шутка, но никто мне в тот вечер больше не постучал в окошко с советом.
Сначала, как и положено, паника. Не знаешь, за что хвататься. Но это ведь не про нас? Мы-то знаем, что любому делу нужен план. Урок, который я для себя уяснил: не надо пытаться представить все сразу у себя в голове. Будет только хуже. Возьмите бумагу и ручку, сделайте зарисовку мыслей. Пусть хоть это и малюсенький счетчик, но когда вы будете сидеть над огромным проектом, это пригодится.
Я не хочу рассказывать, как я трудился над скриптом, просто приведу вам весь его код, а потом мы разберем новые для нас функции.
<head>
<title>страница со счетчиком</title>
</head>
<body>
Hello... This is my first good project.
<BR>
</body>
</html>
<?php
$f = fopen("count.txt","a+t") or die("файл не открывается");
flock($f,2);
$a = fgets($f);
$a = $a+1;
ftruncate($f,0);
fputs($f,$a);
flock($f,3);
fclose($f);
echo "эту страницу просмотрели уже";
echo $a;
echo " человек";
?>
Теперь разберем подробности, что это тут произошло. Для хранения кол-ва посещений я выбрал обычный текстовый файл, поскольку базы данных изучать еще рано
Первое. Чтобы что-то сделать с файлом, его нужно открыть.
Для этого и используется функция fopen(”название файла”,”режим”).
Я сначала пытался просто использовать эту функцию, но, как оказалось, она возвращает специальное число, что-то вроде идентификатора открытого файла. Поэтому надо сохранить его в переменной. В данном случае $f.
Причем нужно указать режим работы с файлом. Я поставил a+t.
a+ означает, что файл будет открыт для записи и чтения, а если файла нет, то он создается автоматически. t означает, что интерпретатор будет видеть файл как набор строк – обычный текст.
Но существуют и другие режимы работы с файлом…
r – файл будет открыт для чтения, указатель позиции ставится в начало. Если файла нет, то вылезет ошибка.
r+ – файл будет открыт для чтения и записи, указатель позиции ставится в начало. если файл не существует, то будет ошибка.
w – будет создан пустой файл и открыт для записи. При наличии одноименного файла произойдет его перезапись
w+ – будет создан пустой файл и открыт для чтения и записи. как и выше при наличии файла с таким же именем произойдет перезапись.
a – файл будет открыт для записи, указатель позиции помещается в конец файла.
Обратите внимание, что тут я использовал конструкцию or die(), которая выведет сообщение об ошибке если не удалось открыть файл.
Далее я применил функцию flock(), которая блокирует файл, чтобы только один пользователь мог с ним работать. Если вы заметили, то после переменной нашего файла стоит число 2. Это означает абсолютный вариант блокировки. Можно еще присвоить значение 3. Это будет означать снятие блокировки, которая была установлена ранее.
fgets() нужна, чтобы прочитать данные из файла. В ходе её выполнения будет считана строка со значением счетчика, которое мы сохраняем в переменную $a.
Затем просто увеличиваем текущее значение на единицу: $a = $a+1.
Теперь у нас есть новое значение, но старое осталось в файле и его надо удалить. Для этого я нашел следующую функцию – ftruncate(). Значение 0 указывает, что обрезать файл надо до нулевого размера.
Чтобы записать новое значение в файл, надо использовать fputs().
Когда действия выполнены, надо снять блокировку. Это делает функция flock(). Для этого параметру блокировки надо передать значение 3.
Ну и после всех действий с файлом его надо закрыть с помощью функции fclose().
Вот и все. Любую, даже поначалу непосильную задачу, можно решить, если не сдаваться
Июнь 23rd, 2008
Супер! спосиба за скрипт цикла… Обезательно использую его у себя на сайте…
Ноябрь 18th, 2008
А где тут цикл то?)))
Ноябрь 18th, 2008
видимо оффтоп )
Декабрь 4th, 2008
“Далее я применил функцию flock(), которая блокирует файл, чтобы только один пользователь мог с ним работать”
Мог бы еще пояснить к чему это может привести: в то время пока один человек читает файл, а потом удаляет его содержимое, другой человек может открыть его как раз в тот момент когда первый удаляет содержимое файла. В итоге второй человек получит пустоту. Но это конечно возможно при очень высокой посещаемости.
А вообще нужно использовать базу данных – удобнее во всем
Май 14th, 2009
Вопрос насчёт блокировки flock(), это что получается если одновременно на сайт зашли 2 пользователя один не засчитается? Или я что-то не так понял.
Май 14th, 2009
Засчитается, но с небольшими тормозами. Когда одновременно два пользователя попытаются записать в файл, один из них будет ждать до тех пор, пока второй не закроет или не разблокирует этот файл, т.е. тут кто первый заблокировал, тот и хозяин. Поэтому файлы редко используются. В основном используют базы данных.
Август 14th, 2009
а как сделать так чтобы переменная $a выводилась в другом php файле? типо чтобы подсчёт статистики был в одном файле (например, он будет называться count.php), а вывод её был в другом (например, в count2.php), чтобы я мог в браузере ввести , и мне там показалобы статистику. Подскажи как это сделать!!
Август 14th, 2009
Очевидно, что для этого нужно код, отвечающий за считывание значения $a, перенести в count2.php.
Август 14th, 2009
там не только это нужно сделать, а ещё чёто что бы count2.php мог распознать что это переменная ($a) файла count.php, напиши плиз мне в асю, 571835920, или оставь свою!!!
Август 15th, 2009
Эту проблему я уже решил вот так:
(в файле count2.php)
$f = fopen(”count.txt”,”a+t”) or die(”файл не открывается”);
$a = fgets($f);
echo “эту страницу просмотрели уже”;
echo $a;
echo ” человек”;
и всё, набираю в браузере адресс и всё робит как я хотел, додумался до этого всего за минуту!!
Но мне совсем не это важно было у тебя спросить, ты сможешь показать как сделать счётчик с хостами за сутки?
Напиши мне в асю, поговорим, 571835920
Ноябрь 30th, 2009
Вопрос собственно таков: как фильтровать браузеры и посковых ботов? ведь странице может в день прокэширвоать 10 поисковиковых ботов и скрит посчитает их как людей…
Январь 2nd, 2010
Напишите тупому человеку HTML код счётчика для картинки
<img src=”http://golocyi.ucoz.ru/banner.jpg”
цифры просто поцентру черным цветом.Спосибо!
Если хотите киньте на pavel.pa77@yandex.ru
Январь 26th, 2010
Я так понял на простом бесплатном html хостинге он роботать не будет
Июнь 27th, 2010
Привет почему неработает на сайте лиш на локальном помогите разобраться