- Подробности
-
Категория: PHP. Файлы
С того момента, как только будет создан ваш сайт, самым первым и очевидным желанием будет узнать, насколько он популярен. Существуют разные возможности, которые могут решить эту проблему. Обычно сервер, который предоставляет вам хостинг, дает очень скудную статистику. В эту статистику входит только количество обращений на сайт и количество переданной информации. Но согласитесь, что этого совсем даже недостаточно. Файлов на сайте очень много и хотелось бы иметь представление о том, что же там у нас скачивают.
Ну и как тогда можно решить эту проблему? Выход есть — счетчики скачиваний. Не пугайтесь, все очень просто. Вы наверняка уже их видели. Обычно этот счетчик устанавливается рядом со ссылкой на скачиваемый документ. Примерно, все выглядит так: Ссылка — Скачали [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"); //Это файл, который нужно скачать
}
else if ($book==2) {
header("location: http://www.сайт.ру/Zip/zip2.zip ");
}
?>
Ну, как, сложно? Давайте разбираться вместе.
Для начала определимся с конструкцией кода. Как вы знаете, чтобы использовать РНР, нужно создать следующую конструкцию:
<?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).
Ну, вот и все. Я старался как можно более понятно и просто объяснить вам процесс установки счетчика скачивания. Тем не менее, если у вас, что-нибудь не получается, пишите мне, и мы постараемся решить проблему вместе.
С уважением,Ченгаев Дмитрий