Вторник, 26.11.2024, 22:56 Вы вошли как Гость | Группа "Гость" | RSS
 

 
Главная | Форум | Чат | Информация для пользователей
[Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Пишем счетчик кликов по ссылке
Grinya Дата: Вторник, 14.06.2011, 15:34 | Сообщение # 1
Легендарный
Группа: Администратор
Сообщений: 365
Статус: Offline
.: Дополнительные данные :.
Бог сайта и форума За хорошую посещаемость на форуме За супер посещаемость За Легендарныйа
Пишем счетчик кликов по ссылке

Наряду с гостевыми книгами, голосованиями и рассылкой почты, различные счетчики стоят на верхних вершины интересов новичков в PHP. Так почему бы не удалить жажду познаний?

Итак, начнем. Для начала давайте определимся, что именно нам надо делать. При клике на ссылку, для подсчета количества кликов, нам надо специальным скриптом засчитать клик, а после предоставить посетителю интересующую его информацию (сделать редирект на нужный файл). В принципе, последовательность (за счет клика и выдача информации) можно поменять местами, однако учтите, что если счетчик используется для подсчета скачиваний файлов, то для того чтобы после скачки файла выполнялся скрипт, потребуется писать специальный скрипт-загрузчик файлов. Зачем вам лишние проблемы? Такой же принцип работы будет и у счетчика посещений. В данном случае, для ускорения загрузки страницы можно обойтись без редиректа, а просто вставить код счетчика в загружаемую страницу.

Вроде разобрались, так? Ну, а теперь давайте приступим к разборке не сложного кода для реализации всех наших идей. Для простоты примера, а также для того чтобы скрипт мог работать на любом хостинге, данные будем хранить в файле.

Code
<?php

$f=fopen("stat.dat","a+");
flock($f,LOCK_EX);
$count=fread($f,100);
@$count++;
ftruncate($f,0);
fwrite($f,$count);
fflush($f);
flock($f,LOCK_UN);
fclose($f);

?>


Да, вы не ошиблись, это и есть весь скрипт. А теперь давайте разберемся, что и как в нем работает.

Первой строчкой кода - $f=fopen("stat.dat","a+"); мы открываем файл stat.dat для чтения и записи, связываем его с файловой переменной $f. Именно этот файл будет хранить данные о состоянии счетчика. Для правильной работы советую устанавливать для данного файла права доступа 777 или аналогичные с полным доступом на чтение и запись.

Следующая строчка - flock($f,LOCK_EX); очень важна для работоспособности скрипта. Что она делает? Она на время работы данного скрипта (или до ее снятия) блокирует доступ к файлу для других скриптов или копии данного. Почему это так важно? Давайте представим ситуацию: в тот момент, когда пользователь1 кликает на ссылку, запускающую скрипт подсчета кликов, по той же ссылке кликает пользователь2, запуская копию того же скрипта. Как вы увидите далее, в зависимости от того, на какой стадии выполнения находится скрипт, запущенный пользователем1, скрипт запущенный пользователем2 и работающий параллельно со своей копией может попросту обнулить счетчик. Эту ошибку допускают практически все начинающие программисты на PHP, создавая подобные счетчики. Теперь, я думаю ясно, зачем нам блокировка доступа к файлу - в данном случае скрипт, запущенный пользователем2 будет ждать пока отработает скрипт, запущенный пользователем1 (не стоит пугаться, что это замедлит загрузку страниц - даже самые медленные серверы выполняют данный скрипт за сотые доли секунды).

С 3-й строчкой кода $count=fread($f,100); все ясно. В переменную $count считываем значение счетчика.

Далее, страхуясь от ошибок ввода/вывода (в частности чтения) засчитываем клик/посещение, увеличивая значение счетчика на единицу @$count++;

Теперь нам осталось произвести запись в файл обновленных данных. Для этого нужно предварительно очистить файл ftruncate($f,0); вот тут и может возникнуть та опасная ситуация с обнулением счетчика, про которую я говорил. Однако мы используем блокировку файла, так что бояться нечего.

Записываем обновленные данные о значении счетчика fwrite($f,$count);

Для надежности принудительно очищаем буфер ввода/вывода для данного файла fflush($f);

Снимаем блокировку с файла flock($f,LOCK_UN); на самом деле ее можно не снимать - она автоматически снимается после закрытия файла. Однако для полноты примера я ее все же написал.

Закрытие файла fclose($f); тоже не обязательная функция т.к. все открытые скриптом файлы, после завершения его работы, автоматически закрываются. Но опять же, для полноты примера... =) кроме того, если на этом скрипт не заканчивается, а работать с файлом более не понадобится, рекомендуется сразу же закрывать файл.

Ну вот и все. Как видите совсем не сложно. Теперь для подсчета количества посещений, просто вставляйте данный код в страницу. А если же вы захотели подсчитать количество скачек какого-то файла, то вставляйте данный код в отдельный PHP файл, ссылку с имени файла заменяем на ссылку на данный скрипт, а в конец скрипта дописываем редирект на файл для скачки. Лучше всего его выполнить на PHP: Header("location:/download_dir/file_to_download.rar");

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

Code
<?php

$f=fopen("stat.dat","a+");
flock($f,LOCK_EX);
$count=fread($f,100);
flock($f,LOCK_UN);
fclose($f);

echo "Количество скачек/кликов: $count"; ?>

flock я использую для чтения более истинных данных, хотя его можно и не применять. А можно чтение параметров и несколько упростить, например, так:

<?php

$s=file("stat.dat"); echo "Количество скачек/кликов: $s[0]"; ?>


В общем, дело вкуса. Поздравляю, вы шагнули на еще одну ступеньку выше к мастерству программирования на PHP. Будут


Chibcha Дата: Вторник, 14.06.2011, 15:59 | Сообщение # 2
Постоянный
Группа: Пользователь
Сообщений: 65
Репутация: 38 []
Статус: Offline
.: Дополнительные данные :.
Бог форума За хорошую посещаемость на форуме За Постоянныйа За помощь народу
Для меня пока это всё сложно. Я полный ноль в написании скриптов.

  • Страница 1 из 1
  • 1
Поиск:
Статистика Форума
Последнии темы Читаемые темы Лучшие пользователи Новые пользователи
  • Я был ТУТ! (24)
  • Наши кнопки (0)
  • Общие правила на сайте (0)
  • Описание различных видео форматов (0)
  • Шаблоны оформления новостей (2)
  • Как вы нашли наш сайт? (8)
  • Сектор Газа, все только о них... (1)
  • Какие хорошие комедии вы видели? (5)
  • Вакансии по разделам на www.7x.net.ua (0)
  • Приглашаем! Журналистов, Риперов... (0)
  • Я был ТУТ! (24)
  • Как вы относитесь к сериалу Звёздные врата: SG-1 (17)
  • Фото приколы. (16)
  • Конкурс на лучший баннер (11)
  • Красивый шаблон для системы uCoz (10)
  • Досчитаем до 100 (9)
  • Анимированное меню (9)
  • Как вы нашли наш сайт? (8)
  • Видео приколы. (8)
  • Увеличь количество посещений своего сайта (7)
  • Grinya
  • A1rBoRnE
  • Chibcha
  • DarkSpirit
  • Змей
  • Fantom
  • Borman
  • Worlak
  • Mister_Coob
  • Anatoliy
  • ZoYOping
  • LeoFreskos
  • Avalancheflu
  • Candyktg
  • Portableddx
  • olemit
  • Valeron83Oping
  • AviorT
  • Blendermog
  • Holographictkx
  • ()


    Copyright MyCorp © 2024 Хостинг от uCoz