ТаблицейБлоками.

Приложение Д: размер, дата, счетчик, протокол посещений

Последняя модификация: 10.08.2014 г

Страница загружена с адреса: http://webdesign.site3k.ru/conjuncture/append/d/info.html

Моя студия веб-дизайна

Информация о размере, дате, собственные счетчики и протоколы посещений

  1. Информация о размере
  2. Информация о дате
  3. Собственные счетчики
  4. Протоколы посещений

Информация о размере

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

Информация о размере в самом файле

Информацию о размере файла в самом файле можно вывести различными способами. Наиболее очевидный из них – с помощью 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" -->

 

 

Комментарии к странице

 

 

 


На главную страницу сайта