Как узнать сколько раз скачали ваш файл

Как узнать сколько раз скачали ваш файл?

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

Ну и как тогда можно решить эту проблему? Выход есть — счетчики скачиваний. Не пугайтесь, все очень просто. Вы наверняка уже их видели. Обычно этот счетчик устанавливается рядом со ссылкой на скачиваемый документ. Примерно, все выглядит так: Ссылка – Скачали [656]. 656 – это и число, которое увеличивается на 1 при каждом скачивании файла, а программа, которая это осуществляет – счетчик скачиваний.

Очень важно понимать, как именно работает счетчик, а уже затем можно приступать к написанию кода.

Первым делом нужно определиться с его структурой: из каких файлов он будет состоять и как все будет взаимодействовать. Для наглядности я хочу привести следующий рисунок.

У нас есть какой-нибудь сайт www.сайт.ru. Допустим, что на этом сайте нужно подсчитывать сколько раз скачивают некоторые книги. Ссылки на книги находится в файле book.php. Для удобства создаем отдельную директорию Counters, в которой будет сам счетчик (counter.php) и текстовые документы, в которых будут храниться данные, сколько раз скачали соответствующую книгу (book1.txt и book2.txt). Вы спросите, а почему бы не использовать для хранения числа скачиваний базу данных? Конечно, book.txt можно заменить базой данной, но для этого нужно специальное программное обеспечение. К тому же текстовые файлы использовать гораздо проще, чем базу данных. А я рассчитываю свою статью в первую очередь на новичков. Несомненно, что на большом сайте использование базы данных является необходимостью. Без нее там никак не обойтись. Просто количество текстовых файлов достигнет такого количества, что управляться с ними станет практически невозможным. Но это уже тема другой статьи.

В итоге, как результат, когда мы открываем файл book.php, то должны видеть примерно следующее:

Ссылка (Количество скачиваний: 25). 25 — это число, которое увеличивается на 1 при нажатии на ссылку.

Теперь попробуем описать, как это цикл работает в целом. Сначала загружается страница с нашей ссылкой и надписью – «Количество скачиваний: 25». Чтобы взять число 25 нужно обратиться к файлу, где оно храниться (book.txt). Как только пользователь нажимает на ссылку, запускается программа (counter.php), которая увеличивает переменную на 1 и записывает ее в текстовый файл. И так каждый раз.

Как видите теоретически все очень просто. Но основные проблемы возникают на практике.

Итак, давайте перейдем к технической стороне вопроса. Начнем непосредственно с самого счетчика (counter.php). Вот код, который необходимо в него вставить.

Сounter.php

<?php
if ($book==1) {

header("location: http://www.сайт.ру/Zip/zip1.zip"); //Это файл, который нужно скачать
$file=fopen("book1.txt","a+"); //Открытие
flock($file,LOCK_EX); //Блокировка
$count=fread($file,100); //Чтение
$count++; // Увеличение значение на 1
ftruncate($file,0); // Очищаем файл
fwrite($file,$count); //Записываем новое значение
flock($file,LOCK_UN); //Разблокируем
fclose($file); //Закрываем

}

else if ($book==2) {

header("location: http://www.сайт.ру/Zip/zip2.zip ");
$file=fopen("book2.txt","a+");
flock($file,LOCK_EX);
$count=fread($file,100);
$count++;
ftruncate($file,0);
fwrite($file,$count);
flock($file,LOCK_UN);
fclose($file);

}
?>

Ну, как, сложно? Давайте разбираться вместе.

Для начала определимся с конструкцией кода. Как вы знаете, чтобы использовать РНР, нужно создать следующую конструкцию:

<?php

…

?>

Тем самым мы даем программе понять, что используем РНР.

Так как скачиваются несколько файлов, чтобы определить на какую именно ссылку нажал пользователь, используется конструкция:

if ($book==1) {Счетчик 1} // Если $book==1, то выполняем Счетчик 1

else if ($book==2) {Счетчик 2} // Если $book==2, то выполняем Счетчик 2

else if ($book==3) {Счетчик 3}

и.т.д. Таким образом, отбор осуществляется с помощью переменной $book. Единственное, каким образом сделать так, чтобы при нажатии на определенную ссылку, присваивалась соответствующая переменная?

Когда вы хотите перейти на определенный сайт, нужно набрать его URL.

Например:

www.сайт.ru/index.php

Но на самом деле URL может иметь более длинный вид. Видели ли вы такую запись:

www.сайт.ru/index.php?параметры

Здесь URL, как бы, разбивается на 2 части: в первой, находится адрес к сайту, а во второй (после знака «?») указываются некоторые параметры. Разделителем является знак вопроса.

Этими параметрами могут быть переменные.

www.сайт.ru/index.php?переменная=значение

Указывая, так переменные, они будут передаваться в открываемый файл. В случае, если нужно объявить сразу несколько переменных, делается это через знак «&».

www.сайт.ru/ index.php?переменная1=значение&переменная2=значение

Таким образом, когда пользователь открывает данную страницу, переменные присваиваются автоматически, что очень удобно. Такой метод передачи переменных в сценарий называется методом GET.

Применим данный метод и в нашем случае. Нужно зайти в документ со ссылками (book.php) и изменить ссылку на файл, следующим образом:

<a href="Counters/counter.php?book=1">. Т.е. сначала идет ссылка на файл счетчик, а после знака «?» задается имя переменной book, которая затем и направит пользователя к соответствующему файлу. Аналогично поступаем для второй и третьей ссылки.

<a href="Counters/counter.php?book=2">

<a href="Counters/counter.php?book=3">

Вот и вся конструкция теперь можно переходить к коду самого счетчика.

Разберем код-счетчика.

— header("location: http://www.сайт.ру/zip1.zip"); — собственно это и есть ссылка на книгу, которую необходимо загрузить. header() – это специальная функция, которая может перейти на новый web-узел, не спрашивая об этом пользователя. Но использовать данную функцию нужно осторожно. Основная ее особенность в том, что она не может запуститься после HTML кода. Иными словами, нельзя сначала поместить html-код, а затем, где-то в середине, header().

— $file=fopen("book.txt","a+");

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

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

1) Открыть файл

2) Извлечь данные из файла и при необходимости их изменить

3) Закрыть файл

Специальная функция для открытия файла: $переменная = fopen(“имя файла”, “режим”);

При открытии файла нужно указать режим, который будет разрешать выполнять с файлом определенные действия после его открытия. Режимы, которые можно устанавливать приведены в следующей таблице:

Режим
Что будет, если файл существует
Что будет, если файла не существует

r
Только чтение
Возникнет предупреждающее сообщение

r+
Чтение и запись
Возникнет предупреждающее сообщение

w
Только запись
Будет создан новый файл. Если файл существует, новый файл будет записан поверх старого

w+
Чтение и запись
Будет создан новый файл. Если файл существует, новый файл будет записан поверх старого

a
Добавление данных в конец файла
Будет создан новый файл.

a+
Чтение и добавление данных в конец файла
Будет создан новый файл.


Таким образом, мы открываем файл book.txt для чтения и изменения его значения. Создается специальная переменная $file, в которой будет храниться открытый файл.

— flock($file,LOCK_EX);. Очень важный элемент. Он блокирует доступ к файлу, на время работы скрипта. Представьте себе, что на ссылку одновременно нажали сразу же два человека. Так как скрипт открывает файл для записи, то может произойти сбой и счетчик просто обнулиться.

— $count=fread($file,100); Далее считываем информацию с открытого файла $file и присваиваем ей переменную $count.

— $count++; — увеличиваем значение на 1. Эта запись эквивалентна следующей ($count = $count+1).

— ftruncate($file,0); — с помощью этой команды содержимое файла (book.txt) очищается. И теперь можно будет свободно записывать туда новую информацию. Именно на этом моменте может произойти сбой при запуске одновременно двух скриптов. Об этом я говорил выше. Но нам уже ничего не страшно, файл блокирован.

— fwrite($file,$count);. Записываем новое значение счетчика.

— flock($file,LOCK_UN);. Теперь файл можно разблокировать и

— fclose($file);. Закрыть.

Когда все написано, не забудьте установить атрибуты (права) на текстовые файлы (txt). Сделать это можно через FTP-клиент. Изменяем атрибуты файла на 666 (rw-rw-rw).

Ну, вот и все. Я старался как можно более понятно и просто объяснить вам процесс установки счетчика скачивания. Тем не менее, если у вас, что-нибудь не получается, пишите мне, и мы постараемся решить проблему вместе.

С уважением,Ченгаев Дмитрий