CFA LogoCFA Logo Computer
Новости Статьи Магазин Драйвера Контакты
Новости
RSS канал новостей
В конце марта компания ASRock анонсировала фирменную линейку графических ускорителей Phantom Gaming. ...
Компания Huawei продолжает заниматься расширением фирменной линейки смартфонов Y Series. Очередное ...
Компания Antec в своем очередном пресс-релизе анонсировала поставки фирменной серии блоков питания ...
Компания Thermalright отчиталась о готовности нового высокопроизводительного процессорного кулера ...
Компания Biostar сообщает в официальном пресс-релизе о готовности флагманской материнской платы ...
Самое интересное
Программаторы 25 SPI FLASH Адаптеры Optibay HDD Caddy Драйвера nVidia GeForce Драйвера AMD Radeon HD Игры на DVD Сравнение видеокарт Сравнение процессоров

АРХИВ СТАТЕЙ ЖУРНАЛА «МОЙ КОМПЬЮТЕР» ЗА 2002 ГОД

Сервер племени апачей

Артем Cosmic ШМАНЦЫРЕВ cosmic@mail.zp.ua

(Продолжение, начало см. в МК № 38-40, 42 (209-211, 213)).
В наше время возрастающей популярностью пользуется включение в визитную карточку предприятия адреса собственного интернет-магазина. О том, что это такое, с чем его едят и как его готовить :-), вы узнаете в этой статье.

«Хочется пива» — часто думаете вы, просыпаясь. Но спускаться с двенадцатого этажа без лифта, идти двести метров пешком (!) до ближайшего киоска, а потом еще и возвращаться обратно нет никакой возможности. А тут еще и верная мышка The Bat! сигнализирует о приходе новой порции рассылок. Что же делать? Выход один: нужно заказать пиво в интернет-магазине (далее — просто ИМ).

Пример, конечно, идеализирован. Но это — дело будущего, и притом весьма недалекого. А возможно, уже завтра вам придется выступать в качестве программиста собственного ИМ. Почему завтра? Да потому что сегодня вы еще не знаете, как это все делается :-). Поэтому давайте обо всем по порядку.

Немного теории

Интернет-магазин — это в первую очередь сайт, размещенный в сети Интернет. И, как и любые другие сайты, интернет-магазины пишутся людьми и для людей. Поэтому не пугайтесь и не думайте, что написание собственного ИМ вам не под силу — это вполне рутинная задача для РНР-программиста, коим вы и собираетесь стать в ближайшем будущем.

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

Интернет-магазины, подобно обычным, имеют свои витрины, на которых выставлен товар. Оформление витрин зависит от дизайнера и может быть весьма различным: от простых текстовых описаний до видеороликов, на которых крутится заветная бутылочка пива :-). Недостатком ИМ можно считать отсутствие возможности потрогать товар руками. Но это с лихвой компенсируется современными мультимедийными возможностями (скриншоты, рисунки, анимация, видео- и Flash-ролики и т.д.)

В качестве примера можно взять известный книжный интернет-маркет http://www.bambook.com.ua, реклама которого часто крутится на телевидении. Организаторы этого ИМ вполне реально позаботились о разнообразии форм оплаты и доставке товара прямо на дом заказчику, при этом сайт не изобилует лишней графикой и вполне сносно загружается в нашем отечественном World Wide Wait :-).

Пишем, пишем, пишем…

Написать ИМ не так сложно, как кажется с первого взгляда. Здесь все строится по аналогии с обыкновенным магазином. Что мы делаем в первую очередь, когда заходим в магазин (читайте — вводим адрес сайта в браузере)? Правильно, ищем отдел с необходимой нам продукцией (в нашем случае — отдел слабоалкогольных напитков :-)). Что дальше? Дальше в отделе выбираем марку пива, которая приглянулась нам больше всего и подходит по цене, и кладем ее в пустую корзину, выданную нам при входе. Затем мы идем в бухгалтерию, где у нас забирают корзину  и выписывают счет, который просят оплатить до определенного срока. В случае оплаты бутылка чаще всего сама приходит к нам домой.

Наш простейший интернет-магазин мы будем строить по той же схеме. Для этого нам понадобится четыре фрейма, которые будут располагаться в браузере примерно так, как показано на Рис. 1 (подразумевается, что вы знаете о том, что такое фреймы, и не будете заваливать мой ящик Рис. 1лишними вопросами :-)). Многие интернет-магазины и по сей день используют морально устаревшую конструкцию FRAME, так как она позволяет несколько минимизировать количество кода, необходимое для написания ИМ.

Для файлов ИМ необходимо в директории документов сервера (f:\www, если вы настраивали Apache по моим рекомендациям) создать новую директорию с именем shop. Все файлы, с которыми мы в дальнейшем будем работать, будут расположены в этой директории и доступны по адресу http://127.0.0.1/shop.

Для того чтобы связать все страницы интернет-магазина, вам необходимо создать страницу-сборку фреймов (index.phtml), которая будет индексной страницей нашего сайта и будет при вызове загружать все указанные страницы фреймов. Кстати, чтобы индексной страницей нашего магазина стал PHTML-файл, в файле конфигурации сервера httpd.conf к директиве DirectoryIndex нужно дописать index.phtml.

Верхний фрейм (top.phtml) — название магазина, его вывеска. Здесь можете дать волю своей фантазии (или необходимости) и оформить страничку так, как вам это нравится. Этот фрейм выполняет особую функциональную роль в нашем магазине — в нем будет располагаться счетчик посетителей. Левый фрейм (left.phtml) будет представлять собой список ссылок на отделы магазина, средний фрейм (central.phtml) — список ссылок на товары в выбранном отделе и, наконец, правый фрейм (right.phtml) — потребительская корзина.

На сервере также будет храниться каталог товаров. Это будет текстовый файл price.csv, созданный в популярном табличном процессоре Microsoft Excel. Мой выбор именно на этот тип файлов пал потому, что РНР имеет встроенные функции для работы с CSV (comma separated values — данные, разделенные запятыми). Кроме того, это упростит вам работу по поддержке прайса (Excel все-таки… :-)).

Ну и, естественно, как и в любом нормальном магазине, мы не сможем обойтись без обновления товаров. Для этого мы создадим отдельную страничку (price.phtml), которая позволит нам интерактивно обновлять каталог продукции на сервере. Эта страничка не будет входить в сборку фреймов и будет вызываться по ссылке, расположенной в верхнем фрейме.

Исходный код индексной страницы (index.phtml) приведен далее.

Думаю, для человека, знакомого с HTML, здесь нет ничего непонятного (если вы не все поняли — могу порекомендовать хорошее online-руководство http://html.manual.ru, без изучения которого нет смысла продолжать изучение РНР). Единственный трюк, который я рискнул здесь применить — это PHP-скрипт, который выводит текущую дату в заголовок браузера, подразумевая дату последнего обновления списка товаров. У неискушенного посетителя это создаст иллюзию постоянной работы программистов, обслуживающих ИМ (что отнюдь не обязательно :-)). Если вы человек честный :-), то можете исключить этот скрипт из страницы или изменять выводимую дату вручную. На синтаксисе этого скрипта остановлюсь подробнее, так как здесь мы встречаем новую Рис. 2функцию — функцию date().

В качестве результата своего выполнения функция date(string format [, int timestamp]) возвращает текущую (или установленную в целочисленном параметре timestamp) дату в формате, указанном в строковом (т.е. заключенном в кавычки) параметре format. Символов форматирования очень много, их комбинаций еще больше. Я приведу лишь некоторые, наиболее часто используемые (возвращаемые результаты — в комментариях):

В параметре timestamp вы можете указать целочисленное значение, представляющее собой число секунд, прошедшее с официального начала компьютерной эры (00 часов 00 минут 1 января 1970 года, официальная дата рождения ОС Unix). При указании параметра timestamp в качестве результата функция date() выдаст форматированную дату, взяв ее не из системного времени сервера, а из этого параметра. Кстати, по принятым стандартам, параметр, значение которого необязательно подставлять в функцию, обозначается в квадратных скобках ([ ]).

Плавно переходим к верхнему фрейму :-). Создайте файл top.phtml и поместите его в директорию документов сервера. С этим файлом мы будем разбираться до конца этой статьи.

Итак, как я уже говорил, файл top.phtml выполняет на нашем сайте особую роль — в нем мы Рис. 3будем выводить счетчик посещений нашего ИМ. Кроме счетчика в верхнем фрейме будет содержаться логотип ближайшего киоска :-) и ссылка на файл price.phtml, предназначенный для закачки прайс-листа на сервер. Исходный код всего этого будет выглядеть примерно так:

Ух, как все запущено… :-) В этом скрипте мы входим в новую область РНР-программирования — работу с файловой системой сервера. Наиболее распространенной платформой для размещения сайтов является ОС Unix и ее клоны — Linux, FreeBSD и т.п. И это естественно: о надежности и стабильности Unix-ориентированных операционных систем слагаются легенды. Выбор ОС не мог не сказаться на специфике работы сервера Apache (который, кстати, первоначально ориентирован на Unix-платформу) и особенно на работу с файлами. В Unix все немножко не так, как в Windows (совсем не так, если быть точным :-)), хотя основные понятия (файл и директория) сохраняют свое значение и здесь (подробнее — в статье Сергея Яремчука «Пингвинье дерево», МК №22(193)). РНР может работать с файловыми системами и Windows и Unix, но мы будем работать только с Unix-путями, так как реальный хостинг-сервер http://holm.ru, на котором мы впоследствии разместим свой ИМ, в качестве серверной платформы использует Unix-клон FreeBSD.

Еще один важный момент — имена файлов и директорий в Unix зависят от регистра написания. Это значит, что имена top.phtml и Top.phtml будут ссылаться на разные файлы, даже если они находятся в одной и той же директории. Будьте внимательны! Также не рекомендую называть файлы и каталоги русскими буквами — если у какого-нибудь пользователя нашего ИМ не будет поддержки кириллицы (например, он живет в Австралии — откуда там кириллица?), он не сможет купить пива в нашем Рис. 4киоске :-), так как не получит доступ к файлу с именем верхний_фрейм.phtml.

Теперь давайте рассмотрим исходный текст фрейма повнимательнее. В первых двенадцати и последних шести строках мы размещаем нужные элементы (логотип и ссылку на страницу обновления прайса) во фрейме. А между ними как раз и находится скрипт счетчика посещений. Здесь и начинается самое интересное…

В строке 14 мы сталкиваемся с новой, доселе неизвестной функцией fopen(), предназначенной для открытия файла. Под открытием здесь подразумевается проверка его (файла) наличия и размещения и, в случае успешного нахождения, возврат указателя на файл в качестве результата. Результат выполнения мы присваиваем «файловой» переменной $fp.

Функция fopen() заслуживает особого внимания с нашей стороны — ее мы будем встречать очень часто по ходу разработки нашего ИМ. Синтаксис она имеет следующий:

Функция в качестве своего значения возвращает указатель на успешно открытый файл или значение FALSE при неудачном выполнении (файл не найден по указанному в строковом параметре filename пути, отказано в доступе и т.п.). Параметр filename может указывать на http-документ (например, http://www.mycomp.com.ua/), индексную страницу ftp-каталога (ftp://ftp.freeware.ru/) или файл на жестком диске сервера. При этом http- и ftp-страницы открываются только для чтения. Параметр зависит от регистра написания. Если путь к файлу не указан, то файл ищется в той же директории, откуда был вызван скрипт.

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

'r' — открываем только для чтения; файловый указатель помещается в начало файла;

'r+' — открываем для чтения и записи; файловый указатель помещается в начало файла;

'w' — открываем только для записи; файловый указатель помещается в начало файла, причем все содержимое файла удаляется. Если файл до этого не существовал — он создается по указанному пути;

'w+' — открываем для чтения и записи; файловый указатель помещается в начало файла, причем все содержимое файла удаляется. Если файл не существует, он создается;

'a' — открываем только для чтения; файловый указатель помещается в конец файла, причем все содержимое файла удаляется. Если файл не существует, он создается;

'a+' — открываем для чтения и записи. файловый указатель помещается в конец файла, причем все содержимое файла удаляется. Если файл не существует, он создается;

Файловый указатель здесь — это виртуальная позиция курсора в файле, с которой начинаются операции чтения/записи (по аналогии с любым текстовым редактором).

Необязательный параметр use_include_path позволяет вам разрешить или запретить поиск файла в каталоге, указанном в переменной include_path в файле php.ini. Чтобы разрешить этот никому не нужный поиск :-), присвойте переменной use_include_path значение 1.

В нашем примере мы открываем файл counter.dat для чтения из него единственной строки — значения счетчика посещений. Еще один маленький момент — перед функцией fopen() в нашем примере стоит значок «коммерческого эт» (@, в просторечье «собака» :-)). Это позволяет «задавить» выведение в браузер сообщения об ошибке в случае неудачного открытия файла. Этот значок можно использовать практически перед любыми функциями РНР — его функция везде одна и та же.

В строках 15 — 23 при помощи логической конструкции if (от английского «если») мы проверяем, успешно ли открыт файл.

Конструкция if — одна из самых важных конструкций в любом языке программирования. Она позволяет выборочно выполнять ту или иную необходимую в данный момент часть кода в зависимости от поставленного условия. Она имеет следующий синтаксис:

Параметр expr представляет собой логическое выражение (больше (>), меньше (<), равно (==), не равно (!=) и т.д.). Если выражение истинно, управление передается в первый блок операторов, иначе (else) — во второй. После выполнения того или иного блока операторов в общем случае управление передается на первый оператор, следующий за конструкцией if.

В нашем случае в первом блоке операторов мы при помощи функции fgets() считываем из файла значение счетчика, присваиваем его переменной $counter и при помощи функции fclose() закрываем файл.

Функция fgets() считывает строку из файла и возвращает ее в качестве своего значения. Она имеет следующий синтаксис:

Параметр fp — реально существующий указатель на корректно открытый файл (в нашем случае —$fp). В необязательном параметре length можно указать длину строки, которую необходимо считать, в байтах. По умолчанию считываются 1024 байта, начиная с текущей позиции файлового курсора.

Функция fclose() закрывает файл, указатель которого передается ей в качестве единственного параметра. Возвращает TRUE, если закрытие произошло успешно, и FALSE в любом другом случае.

В строке 24 с помощью операции инкрементирования к переменной $counter прибавляется единица. Эта операция немного уменьшает количество кода и улучшает читабельность исходника. По сути, можно было написать $counter = $counter + 1 — результат был бы тот же. Также в РНР существует операция декрементирования, уменьшающая значение переменной на единицу (обозначается, например, $counter--;).

Идем дальше. Снова открываем тот же файл, только теперь уже для записи с удалением предыдущего содержимого, и при помощи функции fputs() записываем в него новое значение переменной $counter.

Синтаксис функции fputs() аналогичен синтаксису функции fgets(), с той лишь разницей, что fputs() не считывает строку из файла, а записывает ее.

В последней строке скрипта мы при помощи уже известной функции echo выводим в страницу значение счетчика.

Ну вот и все, отмучались :-). Теперь сохраняйте все, запускайте сервер, открывайте браузер и вводите адрес: http://127.0.0.1/shop. В правом верхнем углу страницы вы должны увидеть цифру 1. Если не видите, нужно снова тщательно проверить скрипт на предмет наличия всяких грамматических ошибок. Если видите, нажмите кнопку «Обновить» браузера, и единичка плавно превратится в двоечку… :-).

На сегодня все. В следующей статье мы займемся левым, самым сложным фреймом нашего интернет-магазина. Оптимистично звучит, правда :-)?

(Продолжение следует)

Рекомендуем ещё прочитать:






Данную страницу никто не комментировал. Вы можете стать первым.

Ваше имя:
Ваша почта:

RSS
Комментарий:
Введите символы или вычислите пример: *
captcha
Обновить





Хостинг на серверах в Украине, США и Германии. © sector.biz.ua 2006-2015 design by Vadim Popov