Задача 2. Как написать счетчик посещений.

“Напиши мне простой счетчик посещений” - сказал мне мой “наставник” и вышел из аськи. Все это похоже на то, как учат детей плавать. Берут за руки и за ноги и кидают в воду. А дальше - хоть тони, хоть плыви. Я сначала подумал, что это шутка, но никто мне в тот вечер больше не постучал в окошко с советом.

Сначала, как и положено, паника. Не знаешь, за что хвататься. Но это ведь не про нас? Мы-то знаем, что любому делу нужен план. Урок, который я для себя уяснил: не надо пытаться представить все сразу у себя в голове. Будет только хуже. Возьмите бумагу и ручку, сделайте зарисовку мыслей. Пусть хоть это и малюсенький счетчик, но когда вы будете сидеть над огромным проектом, это пригодится.
Я не хочу рассказывать, как я трудился над скриптом, просто приведу вам весь его код, а потом мы разберем новые для нас функции.

<html>
<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().

Вот и все. Любую, даже поначалу непосильную задачу, можно решить, если не сдаваться 😉





Читайте также:



16 Ответов на “Задача 2. Как написать счетчик посещений.”

  1. lena

    Супер! спосиба за скрипт цикла… Обезательно использую его у себя на сайте…

  2. icerock

    А где тут цикл то?)))

  3. novice

    видимо оффтоп )

  4. “Далее я применил функцию flock(), которая блокирует файл, чтобы только один пользователь мог с ним работать”

    Мог бы еще пояснить к чему это может привести: в то время пока один человек читает файл, а потом удаляет его содержимое, другой человек может открыть его как раз в тот момент когда первый удаляет содержимое файла. В итоге второй человек получит пустоту. Но это конечно возможно при очень высокой посещаемости.

    А вообще нужно использовать базу данных - удобнее во всем

  5. Вопрос насчёт блокировки flock(), это что получается если одновременно на сайт зашли 2 пользователя один не засчитается? Или я что-то не так понял.

  6. novice

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

  7. Владислав

    а как сделать так чтобы переменная $a выводилась в другом php файле? типо чтобы подсчёт статистики был в одном файле (например, он будет называться count.php), а вывод её был в другом (например, в count2.php), чтобы я мог в браузере ввести [ссылка] , и мне там показалобы статистику. Подскажи как это сделать!!

  8. novice

    Очевидно, что для этого нужно код, отвечающий за считывание значения $a, перенести в count2.php.

  9. Владислав

    там не только это нужно сделать, а ещё чёто что бы count2.php мог распознать что это переменная ($a) файла count.php, напиши плиз мне в асю, 571835920, или оставь свою!!!

  10. Владислав

    Эту проблему я уже решил вот так:
    (в файле count2.php)
    $f = fopen(“count.txt”,”a+t”) or die(“файл не открывается”);

    $a = fgets($f);

    echo “эту страницу просмотрели уже”;
    echo $a;
    echo ” человек”;

    и всё, набираю в браузере адресс и всё робит как я хотел, додумался до этого всего за минуту!!
    Но мне совсем не это важно было у тебя спросить, ты сможешь показать как сделать счётчик с хостами за сутки?
    Напиши мне в асю, поговорим, 571835920

  11. Вопрос собственно таков: как фильтровать браузеры и посковых ботов? ведь странице может в день прокэширвоать 10 поисковиковых ботов и скрит посчитает их как людей…

  12. PPA

    Напишите тупому человеку HTML код счётчика для картинки
    <img src=”https://golocyi.ucoz.ru/banner.jpg”
    цифры просто поцентру черным цветом.Спосибо!
    Если хотите киньте на

  13. Я так понял на простом бесплатном html хостинге он роботать не будет

  14. Привет почему неработает на сайте лиш на локальном помогите разобраться

  15. На сайте на работает, потому что в настройках рhр по умолчанию стоит запрет на изминение файлов, а на некотрый хостингах (или менеджерах) стоит запрет и на их чтение. Пошартесь в насртойках , или перейдите с пхп на скрипты

  16. После долгих и четных поисков смирился и решил написать свой.
    Получился довольно удобный, полноценный и серьёзный продукт.
    Я его выложил: холостов.рф/download/counter
    Только единственная просьба - соблюдайте авторские права.
    Инструкция по использованию, и описания в архиве.
    Если у вас будут вопросы - постараюсь на них ответить.
    Это мой сайт, и контакты вы найдёте на главной странице.


© Copyright. . I-Novice. All Rights Reserved. Terms | Site Map