Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

PHP для начинающих


Партнерская программа Wizards World - заработай вместе с крупной онлайновой игрой. Размести ссылку на своем сайте и получай проценты от платежей привлеченных пользователей.

И снова здравствуйте! :)

Новый год мы все в некотором смысле начинаем сначала. Особенностью тематики «... для начинающих» является то, что она неизбежно перестает такой быть. Краткий предновогодний мини-курс был посвящен самому общему взгляду на мир программирования и тому, что его окружает – концепции, инструменты, стандарты. Тоже вещи немаловажные, но несколько в стороне от нашего основного пути. Сейчас пришло время вернуться «на путь истинный».

Как известно, лучший способ чему-либо научиться – начать это делать. Вот и мы в каждом выпуске будет писать готовые законченные программы. Программы, которые при всей простоте, будут полезны любому в качестве готового кода.

Однако не будем упускать из виду того, что обучение всегда ведется на «игрушечных» примерах. Промышленный код делает упор на производительность, а мы будем писать прежде всего наглядно. По возможности даже, используя девиз “Code is poetry”, красиво.

Но к делу. Задачей этого выпуска будет система статистики. Напишем собственный счетчик посещений.

При наличии множества готовых счетчиков с громадным объемом получаемой от них информацией, писать что-то свое кажется нелепостью. Мы же не собираемся переписать HotLog, но в качестве примера счетчик ничем не хуже.

<?php
/*

  Счетчик посещений, 18.01.2007 17:49:53
   Этот код можно включать в любой скрипт при помощи Include
    или запускать неаосредственно.
    Счетчик посещений хранится в текстовом файле в простом текстовом формате.
*/
   
$page = $_SERVER ['REQUEST_URI'];
    @$file = fopen ("count.txt","r");    
if ($file) while (!feof($file)) {
        list ($page_name,$count) = explode (' ', fgets ($file));
        $counter [$page_name] = (int) $count;
    }
    $counter [$page]++;
    foreach ($counter as $page => $count) if ($count > 0) $str
.= "$page $count\n";
    file_put_contents ("count.txt",$str);
?>

Итак, что же делает этот код? Сначала человеческим языком. Требуется узнать, сколько раз обращались к страницам, вызывающим этот фрагмент, потом увеличить это значение на 1 и сохранить полученное число в текстовом файле счетчика.

Теперь формальным языком алгоритма:

  1. Определить текущую ссылку, то есть полное имя скрипта, вызывающего счетчик
  2. Получить все значения счетчика
  3. Увеличить на 1 значение, соответствующее текущей ссылке.
  4. Его в текстовой базе счетчика

Программа, как Вы можете видеть, полностью соотвествует "переводу с русского на PHP". Посмотрим на нее внимательно...

Первая строчка. Тут все понятно. В переменную $page заносится значение глобальной переменной $_SERVER ['REQUEST_URI']. Это можно запомнить как заклинание, достаточно знать, что есть такой ассоциативный массив и в нем есть такое значение, в котором хранится текущая строка запроса.

Подчеркиваю я те слова, который могут быть непонятны, но найти описание которых достаточно просто. Вместо того, чтобы тратить время (и траффик!) тех, кто знает, что это такое, я не копирую сюда многократно повторяющие друг друга руководства, а просто обозначаю ключевые термины, по которым можно все легко найти в любом справочнике. Ведь мы собираемся учиться думать, а не заучивать справочники, не так ли? :)

Следующая строка создает переменную, которая используется в качестве посредника при работе с открываемым файлов, так называемый хэндлер (от англ. "hahdle" - "управлять"). Обратите внимание на @ в начале строки. Без нее при первом запуске выводилось бы предупреждение -- попытка открыть несуществующий файл. Чтобы не смущать пользователя, это неизбежное зло можно проигнорировать, поставив перен ней знак @.

Дальше достаточно запутанная конструкция из if и while. Она может такой показаться на первый взгляд, но все очень просто. Так как фигурные скобки можно опустить в случае с одной командой, то описанная конструкция эквивалентна боле громоздкой, но понятной...

If ($file) 
{
while (!feof($file))
{
...
}

 

Однако в более сложных случаях с ветвлением if-else могут возникнуть сложности, поэтому краткий стиль все же не самый желательный.

Команда explode разбивает строку, полученную из файла функцией fgets, используя в качеству разделителя пробел и возвращает массив из получившихся фрагментов. А поскольку их количество всегда равно двум, то в той же строке мы разносим значения по переменным командой list.

Теперь мы коснемся такой технологии как ассоциативный массив.Массив, как известно, это набор значений внутри одной переменной, доступ к который осуществляется по индексу. В обычном массиве в качестве индекса используются целые числа, в ассоциированном - строки. Это важно для понимания примера.

Примечание: индекс ассоциативного массива называют еще ключом. 

Перебирая текстовый файл count.txt, мы создаем ассоциативный массив чисел, связанных со строкой запроса. Потом увеличивает на единицу тот элемент массива, индекс которого совпадает с текущей строкой вызова. То есть, собственно, отмечаем еще одно посещение текущей страницы. Перебирает все значения массива и если те из них, которые больше нуля, конструирует многострочный текст в переменной, которая затем одной командой сохраняется обратно в файл, создавая его заново.

Есть, разумеется, множество сложностей при промышленном использовании этого примера. Это и необходимость держать папку открытой для записи и создания файлов, и отсутствие защиты от сбой и еще одна проблема, о которой я предлагаю подумать Вам, мой уважаемый читатель. Чтобы направить Вашу мысль в нужную сторону, скажу лишь, что при одновременных обращениях к веб-серверу к одной и той же страницы код выполняется одновременно в параллельных "ветках" веб-сервера. Мы поговорим об этом в следующем выпуске...

Оставайтесь с нами!

Бесплатный каталог Webfile - музыка, видео, картинки!
Подпишись на обновления и получай по почте прямые ссылки на новые файлы!
Подпишись на обновления каталога:


В избранное