ТаблицейБлоками.Приложение Д: размер, дата, счетчик, протокол посещений |
Последняя модификация: 10.08.2014 г
Страница загружена с адреса: http://webdesign.site3k.ru/conjuncture/append/d/info.html
Информацию о размере файла можно получить и вывести в самом файле или в отдельном файле (например, файле, содержащим на него ссылку). Последнее наиболее удобно, когда файл предназначен для закачки. Уместно предупредить посетителя о размере файла, который ему предстоит закачать.
Информацию о размере файла в самом файле можно вывести различными способами. Наиболее очевидный из них с помощью JavaScript. Достаточно записать следующий код:
<SCRIPT LANGUAGE="JavaScript"><!-- document.writeln("<P>Размер файла: "+document.fileSize+" байт"); // --> </SCRIPT>
Однако этот метод обладает существенным недостатком: он работает только в Internet Explorer. Не менее важным является и то, что он не сработает, если в браузере отключен JavaScript.
Этот метод применим и в самом файле, но главной его особенностью можно считать то, что он может показывать информацию о размере любого файла в том же домене, что существенно, если требуется вывести информацию об архиве, который предлагается к закачке. Кроме того, он не зависит от браузера, лишь бы сервер поддерживал SSI-директивы.
<!--#config sizefmt="bytes" --> <!--#fsize file="наименование.файла" -->
где наименование.файла имя файла, информацию о размере которого требуется вывести (подробнее смотрите в SSI). Если информацию о размере файла требуется вывести в этом же файле, вместо имени файла можно вставить переменную ${DOCUMENT_NAME}:
<!--#config sizefmt="bytes" --> <!--#fsize file="${DOCUMENT_NAME}" -->
Такой способ удобен как шаблон. Его можно включать во все файлы без разбора, не утруждаясь написанием реального имени файла.
Значения, полученные через JavaScript и SSI, будут отличаться, так как SSI покажет размер файла на диске, а JavaScript размер закачанного файла с учетом того что, SSI-инструкции будут заменены другим содержимым.
Информацию о дате последней модификации файла можно получить и вывести в самом файле или в отдельном файле (например, файле, содержащим на него ссылку). Последнее позволяет посетителю определить, изменилось ли содержимое с момента последнего просмотра (закачки) или нет и, стоит ли вновь задействовать ссылку, указывающую на этой файл.
Информацию о дате последней модификации файла в самом файле можно вывести различными способами. Наиболее очевидный из них с помощью JavaScript. Достаточно записать следующий код:
<SCRIPT LANGUAGE="JavaScript"><!-- document.writeln("<P>Последняя модификация: "+document.lastModified); // --> </SCRIPT>
Этот метод работает практически во всех браузерах, однако он не сработает, если в браузере отключен JavaScript.
Этот метод применим и в самом файле, но главной его особенностью можно считать то, что он может показывать информацию о дате последней модификации любого файла в том же домене, что существенно, если требуется вывести информацию об архиве, который предлагается к закачке. Кроме того, он не зависит от браузера, лишь бы сервер поддерживал SSI-директивы.
<!--#config timefmt="%d.%m.%Y г" --> <!--#flastmod file="наименование.файла" -->
где наименование.файла имя файла, информацию о дате последней модификации которого требуется вывести (подробнее смотрите в SSI). Если информацию о дате последней модификации файла требуется вывести в этом же файле, вместо имени файла можно вставить переменную ${DOCUMENT_NAME}:
<!--#config timefmt="%d.%m.%Y г" --> <!--#flastmod file="${DOCUMENT_NAME}" -->
Такой способ удобен как шаблон. Его можно включать во все файлы без разбора, не утруждаясь написанием реального имени файла.
Собственные счетчики сделать труднее, чем вывести информацию о размере файла, но простейший счетчик на PHP выглядит так:
<!--#include virtual="/download.php?get=$DOCUMENT_NAME" -->
Данный код первой строкой запустит скрипт download.php из корневого каталога сайта и передаст ему имя файла, посещаемость которого следует считать.
Файл download.php при этом должен иметь следующий вид:
<?php $counterdir = "counters"; // директория, где будут находиться файлы счетчики $file = fopen("$counterdir/$get.txt","a+"); // открываем счетчик загрузок на добавление flock($file,LOCK_EX); // ждем , пока не заблокируем файл @$count = fread($file, filesize("$counterdir/$get.txt")); // читаем счетчик $count += 1; // увеличиваем счетчик на 1 ftruncate($file,0); // очищаем все содержимое файла fwrite($file, $count); // записывает результат в файл счетчика fflush($file); // сбрасываем все изменения на диск flock($file,LOCK_UN); // разблокируем файл fclose($file); // закрываем файл echo $count; // Показываем счетчик ?>
Все почти тоже, но есть некоторые отличия:
<a href="/download.php?get=наименование.файла&path=полный_путь_к_странице_на_сервере">Скачать!!!</a> Закачено <!--#include virtual="/counters/наименование.файла.txt" --> раз(а).
То есть, обязательно требуется указать имя файла и полный путь к странице на сервере (вместо этого можно использовать функции basename и pathinfo).
Кроме того, отличия будут в файле download.php:
Файл download.php при этом должен иметь следующий вид:
<?php $counterdir = "counters"; // директория, где будут находиться файлы счетчики if (file_exists("$path")) { header("location: $get"); // загружаем файл $file = fopen("$counterdir/$get.txt","a+"); // открываем счетчик загрузок на добавление flock($file,LOCK_EX); // ждем , пока не заблокируем файл @$count = fread($file, filesize("$counterdir/$get.txt")); // читаем счетчик $count += 1; // увеличиваем счетчик на 1 ftruncate($file,0); // очищаем все содержимое файла fwrite($file, $count); // записывает результат в файл счетчика fflush($file); // сбрасываем все изменения на диск flock($file,LOCK_UN); // разблокируем файл fclose($file); // закрываем файл } else echo "<font size=2 color=red><center>Невозможно найти файл <b>$path</b>"; ?>
В этом варианте появилась проверка наличия файла (ссылка ведь может быть не верна) и дополнительная строка: «header("location: $get");», необходимая для того, чтобы помимо загрузки скрипта, произошла и загрузка требуемого файла. Зато отображение рузультатов счетчика перененесено на SSI-инструкцию <!--#include virtual="/counters/наименование.файла.txt" -->, так как отображение количества загрузок должно происходить независимо от запуска скрипта.
Оба метода можно совместить, чтобы не делать два различных скрипта-счетчика, если в команду вызова скрипта добавить третий параметр:
<!--#include virtual="/download.php?get=$DOCUMENT_NAME" -->
Для отображения счетчика в самом файле и
<a href="/download.php?get=наименование.файла&path=относительный_путь_к_странице&load=1">Скачать!!!</a> Закачено <!--#include virtual="/counters/наименование.файла.txt" --> раз(а).
Для счетчика рядом со ссылкой.
Файл download.php при этом должен иметь следующий вид:
<?php function ridwrite(){ global $get,$count; // укажем что, используются общие переменные, а не локальные копии $counterdir = "counters"; // директория, где будут находиться файлы счетчики $file = fopen("$counterdir/$get.txt","a+"); // счетчик загрузок flock($file,LOCK_EX); // ждем , пока не заблокируем файл @$count = fread($file, filesize("$counterdir/$get.txt")); // читаем счетчик $count += 1; // увеличиваем счетчик на 1 ftruncate($file,0); // очищаем все содержимое файла fwrite($file, $count); // записывает результат в файл счетчика fflush($file); // сбрасываем все изменения на диск flock($file,LOCK_UN); // разблокируем файл fclose($file); // закрываем файл } if (@$load==1){ // загружаем файл, если требовалась загрузка, иначе показываем счетчик if (file_exists(realpath("$path"))){ ridwrite(); header("location: $path"); } else echo "<font size=2 color=red><center>Невозможно найти файл <b>http://".$_SERVER["SERVER_NAME"]."/$path</b></center>"; }else{ ridwrite(); echo $count; } ?>
Естественно, что вместо включения скрипта из отдельного файла, можно включить скрипт в саму страницу. Можно изменить и многое другое здесь предложен только один из вариантов. Например, для закачки файлов с другого сайта, необходимо убрать проверку file_exists, да и для своего сайта, она не обязательна.
Для отслеживания посещений страниц можно создать следующий PHP-скрипт:
<?php @$logfile="$DOCUMENT_ROOT/log.txt"; @$file = fopen($logfile,"a+"); if (@$file){ flock($file,LOCK_EX); // ждем , пока не заблокируем файл (если нужно) $accessdate = date("d-m-Yг. H:i:s"); // Дата и время посещения $referer = urldecode(@$HTTP_REFERER); // Страница, с которой совершен переход (если была) $REQUEST = urldecode(@$REQUEST_URI); // Посещенная страница $USER_AGENT = @$HTTP_USER_AGENT; $SERVERNAME = @$SERVER_NAME; fwrite($file, "$accessdate\r\n$referer -> http://$SERVERNAME$REQUEST\r\n$USER_AGENT\r\n---------------------------------------\r\n"); fflush($file); // сбрасываем все изменения на диск flock($file,LOCK_UN); // разблокируем файл fclose($file); if (filesize($logfile) >= 100000) { $header="From: АДРЕС\nReply-To: АДРЕС"; $header.="\nContent-type: text/plain; charset=\"windows-1251\""; $file=fopen($logfile,"r"); $text=fread($file, filesize($logfile)); fclose($file); unlink($logfile); mail("АДРЕС","log $SERVERNAME",$text,$header); } }else{ $header="From: АДРЕС\nReply-To: АДРЕС"; $header.="\nContent-type: text/plain; charset=\"windows-1251\""; $text='Не могу открыть лог-файл на ' .@$SERVERNAME; mail("АДРЕС","=?windows-1251?B?". base64_encode("Внимание! ОШИБКА"). "?=",$text,$header); } ?>
Данный скрипт, если сможет (файл не блокируется и может оказаться недоступным для записи, но это не принципиально), запишет блок, состоящий из даты и времени запроса страницы, имени страницы, с которой совершен переход (если на страницу не зашли прямо набрав ее адрес), имени запрошенной страницы и агента, запрашивающего (это может быть не только браузер, но и поисковый робот или какая-то сайтокачалка) в файл log.txt. Для удобства чтения, блок отделится от следующего строкой тире. При достижении размера 100 тысяч байт, файл log.txt будет отправлен вам по почте на указанный АДРЕС с темой «log» и стерт с сервера для того, чтобы протокол не разрастался до бесконечности.
Скрипт можно включить в страницу напрямую, либо командой
<!--#include virtual="/log.php" -->