Книга «Apache, Perl, MySQL: практика создания динамических сайтов»

Эту книгу можно рассматривать как второй том, закономерное логическое продолжение вышедшей ранее моей книжки «HTML, CSS, скрипты: практика создания сайтов». Книга адресована веб-разработчикам, уже имеющим за плечами опыт создания сайтов с применением базовых технологий стороны клиента — HTML, CSS и, возможно, JavaScript, но осознавшим необходимость двигаться дальше, научиться эффективно использовать в своей практике серверные решения.

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

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

Искусство и наука создания динамических сайтов раскрывается в моей книге, главным образом, на примере следующих технологий и программно-инструментальных средств: протокол HTTP; веб-сервер Apache 1.3.x; включения на стороне сервера SSI, реализованные в Apache; общий шлюзовой интерфейс CGI; язык программирования Perl 5; система управления базами данных MySQL 4.x — 5.x. Этот перечень — по сути дела, классика жанра, и наверняка найдутся те, кто сочтет мой выбор избитым или даже утратившим свою актуальность. Предвижу, в частности, многочисленные укоры относительно того, что CGI-программирование с использованием Perl якобы уходит в прошлое под напором более симпатичного разработчикам языка PHP. А кто-то, вероятно, и вовсе скажет, что начинать изучение серверных веб-технологий стоило бы на примере Ruby on Rails, поскольку эти язык и фреймворк еще проще в освоении, чем пресловутый PHP.

Подобная позиция, однако, на мой взгляд, насквозь порочна. Напомню, что первоочередная задача моей книги состоит в раскрытии фундаментальных принципов работы динамических веб-приложений. А для этой цели «классика» подходит как нельзя лучше. Здесь уместно провести аналогию — вероятно, отнюдь не случайно в автошколах начинающие водители учатся управлять автомобилями с механическими коробками передач, несмотря на то, что «автомат» с точки зрения новичка гораздо удобнее. Точно так же летчики, пилотирующие сверхзвуковые истребители Су-27 и МиГ-29, вовсе не случайно провели свои первые часы в воздухе за штурвалами учебных самолетов Як-18 или Як-52. Спешу заметить, однако, что рассматриваемая в книге технологическая база, в отличие от упомянутых самолетов, отнюдь не является «учебной». Перечисленные выше серверные решения в настоящее время используются колоссальным множеством реальных веб-сайтов, и любой вменяемый хостинг-провайдер поддерживает их.

Книга сопровождается компакт-диском с несколькими десятками тщательно протестированных и гарантированно работоспособных примеров веб-приложений. К ним, в частности, относятся: небольшой информационный сайт, автоматизированный при помощи SSI; счетчик посещаемости; лента пользовательских комментариев; информационно-поисковая система; система голосования; система публикации новостей для сайта. Все примеры являются простыми и легко повторяемыми. Компакт-диск также содержит свободно распространяемое открытое программное обеспечение, которое позволит с легкостью заниматься разработкой динамических веб-приложений и разнообразными экспериментами на локальной машине, работающей под управлением Windows. Речь идет о различных вариантах дистрибутивов Apache, Perl и MySQL. «Изюминкой» компакт-диска являются два «джентльменских набора» программного обеспечения, позволяющих буквально за минуту создать на любой Windows-машине все условия для веб-разработки с использованием технологий стороны сервера.

Официальная аннотация

Обложка книги «Apache, Perl, MySQL: практика создания динамических сайтов»

Ломов А. Ю. Apache, Perl, MySQL: практика создания динамических сайтов. Самоучитель. — СПб: БХВ-Петербург, 2007. — 368 с.: ил.

ISBN 978-5-94157-900-6

Рассматриваются классические технологии и программно-инструментальные средства, применяемые для разработки динамических веб-приложений, функционирующих на стороне сервера. Обсуждаются протокол HTTP 1.1, веб-сервер Apache 1.3.x, технология SSI, реализованная в Apache, интерфейс CGI, язык программирования Perl 5, СУБД MySQL 4.x — 5.x. Изложение сопровождается многочисленными примерами: небольшой автоматизированный при помощи SSI информационный сайт, счетчик посещаемости, лента комментариев, информационно-поисковая система, система голосования, система публикации новостей для сайта и др. Компакт-диск содержит практические примеры веб-приложений и свободно распространяемое программное обеспечение, необходимое веб-разработчику.

Для веб-разработчиков.

Подробное оглавление

  • Введение
    • Цели, задачи и особенности этой книги
    • Для кого предназначена книга
    • Чему научит книга
    • Краткий экскурс по главам и приложениям
    • Обзор компакт-диска
    • Благодарности
  • Глава 1. Механизмы функционирования динамических сайтов
    • Описание протокола HTTP
      • Этапы HTTP-транзакции
      • Формат HTTP-сообщений
        • Строка запроса
        • Статусная строка
      • Заголовки HTTP-сообщений
        • Практическое исследование заголовков реальных сообщений
          • Заголовок запроса
          • Заголовок ответа
      • Некоторые полезные расширения протокола HTTP
        • Поле заголовка Refresh
        • Cookies
        • Использование тега <meta> для эмуляции HTTP-заголовков
    • Динамические технологии стороны сервера — интерактивность без компромиссов
    • Устройство динамического сайта
  • Глава 2. Знакомство с веб-сервером
    • Установка и запуск Apache
    • Компоненты веб-сервера Apache
    • Конфигурация сервера
      • Синтаксис директив конфигурации сервера
      • Знакомство с файлом httpd.conf
        • Директивы общей конфигурации сервера
        • Директивы конфигурации основного узла
      • Типовые задачи и их решение
        • Файлы управления доступом
        • Кодировка по умолчанию
        • Список индексных страниц
        • Обработка директив SSI
        • Страница с сообщением об ошибке
        • Закрытая область узла
        • Виртуальные узлы
    • Настроенный сервер
  • Глава 3. Использование включений на стороне сервера SSI
    • Сущность включений на стороне сервера
    • Синтаксис директив SSI
    • Вставка содержимого одного документа в другой — типичное использование SSI
    • Исполнение CGI-скриптов, программ и системных команд
    • Вывод размера и времени модификации файла
    • Переменные окружения
    • Пользовательские переменные
    • Обработка условий
    • Практический пример — автоматизация статического сайта при помощи SSI
  • Глава 4. Создание динамических веб-приложений с использованием общего шлюзового интерфейса CGI и языка программирования Perl
    • Возможности и особенности CGI
    • Язык Perl — основное средство разработки CGI-скриптов
    • Простейший скрипт на Perl
      • Запуск CGI-скриптов в среде UNIX
        • Путь к интерпретатору Perl
        • Переходы на новую строку
        • Права доступа
    • Знакомство с Perl
    • Типы и структуры данных в Perl. Переменные, массивы и хэши
    • Операции и выражения
    • Конструкции языка Perl
    • Возможности Perl по обработке строк, массивов и хэшей
      • Обработка строк
      • Обработка массивов
        • Цикл foreach
      • Обработка хэшей
    • Работа с файлами
      • Получение служебной информации о файле
      • Открытие и закрытие потоков
      • Построчные чтение и запись
      • Блокировка файлов
    • Регулярные выражения в Perl
    • Практический пример — счетчик посещаемости
    • Практический пример — форматированный вывод переменных окружения
    • Практический пример — использование cookies
  • Глава 5. Обработка данных веб-форм при помощи CGI
    • Веб-формы как средство обратной связи с пользователем
    • GET или POST? Сравнительный анализ методов передачи данных
    • Получение данных, переданных пользователем через веб-форму
    • Разбор строки запроса в кодировке URL, декодирование имен и значений параметров
    • Библиотека подпрограмм для работы с CGI-скриптами
    • Практический пример — гостевая книга или лента комментариев
    • Практический пример — информационно-поисковая система
    • Практический пример — система голосования
  • Глава 6. Реляционные базы данных
    • Назначение баз данных и систем управления базами данных, их разновидности
      • Основные сведения о модели «сущность — связь»
      • Классификация СУБД
        • Иерархические СУБД
        • Сетевые СУБД
        • Реляционные СУБД
        • Объектно-ориентированные и объектно-реляционные СУБД
    • Основы проектирования реляционных баз данных
      • Нормализация реляционных баз данных
        • Обзор нормальных форм
      • Практическое проектирование инфологических моделей реляционных баз данных
      • Переход к даталогической модели
    • Особенности и установка MySQL
      • Краткая характеристика MySQL
      • Установка MySQL
      • Запуск сервера баз данных MySQL
      • Запуск консольного клиента MySQL
    • Управление базами данных при помощи языка SQL
      • История, стандарты и назначение языка SQL
      • Просмотр, создание и удаление баз данных
      • Управление кодировками баз данных
      • Создание, просмотр и удаление таблиц в базах данных
        • Типы данных, используемые в таблицах
          • Числовые типы данных в MySQL
          • Текстовые и двоичные типы данных в MySQL
          • Календарные типы данных в MySQL
          • Значение NULL, запрет значений NULL, значения по умолчанию
        • Первичный ключ и другие типы индексов в таблицах
          • Автоматическое инкрементирование значений первичного ключа
        • Физические типы таблиц MySQL
        • Внешние ключи и ссылочная целостность
      • Вывод описания таблицы
      • Добавление записей в таблицу
      • Выборка данных из таблиц
        • Выборка избранных столбцов
        • Выборка записей по условию
        • Сортировка выборки
        • Получение уникальных значений
        • Ограничение выборки
      • Удаление записей из таблиц
      • Модификация записей в таблицах
      • Вставка записей в таблицы многотабличных баз данных с использованием вложенных запросов
      • Выборка данных из нескольких таблиц
      • Транзакции и блокировка таблиц
        • Реализация транзакций в MySQL
        • Блокировка таблиц
      • Использование сложных выражений в составе SQL-запросов
      • Импорт данных в таблицы и экспорт данных из таблиц
      • Преобразование таблиц
    • Практический пример — база данных «Библиотека»
  • Глава 7. Использование СУБД MySQL в веб-приложениях
    • Связь CGI-скриптов с базами данных
      • Установка Perl с модулями DBI и DBD::mysql
      • Использование интерфейса DBI
    • Практический пример — система публикации новостей для сайта
      • Состав проектируемого веб-приложения
      • Изменения в коде страниц, шаблонов и листов стилей исходного сайта
      • Главная страница панели управления и файлы управления доступом
      • Настройка параметров подключения к базе данных
      • Подготовка приложения к работе
      • Скрипт перестройки таблицы
      • Скрипт добавления данных
      • Скрипт просмотра новостей
      • Скрипт выбора новостей для редактирования и удаления
      • Скрипт редактирования новостей
      • Скрипт удаления новостей
    • Вместо заключения
  • Приложения
    • Приложение 1. Коды статуса, предусмотренные спецификацией протокола HTTP 1.1
    • Приложение 2. Переменные окружения CGI и SSI
    • Приложение 3. Описание компакт-диска
  • Предметный указатель

Замеченные неточности и опечатки

К сожалению, и тут без них не обошлось. Нет в мире совершенства…

О блокировке файлов

В разделе «Блокировка файлов» главы 4 (с. 125—126) обсуждается Perl-функция flock(). Так, оператор:

flock(OutFile, LOCK_EX);

блокирует файл, которому соответствует дескриптор OutFile, обеспечивая процессу монопольный доступ к нему. А оператор:

flock(OutFile, LOCK_UN);

осуществляет обратную операцию — разблокировку файла. Все это, безусловно, так, но я по досадному недоразумению совершенно упустил из виду одну немаловажную деталь. Константы LOCK_EX и LOCK_UN, используемые в качестве аргументов функции flock(), неизвестны интерпретатору Perl. Их можно импортировать, используя модуль Fcntl:

use Fcntl ':flock';

Данная строка должна располагаться в коде скрипта ранее первого вызова функции flock().

Проблема в том, что модуль Fcntl (кстати говоря, требующий для своей работы наличия ряда других модулей) не входит ни в один из наших фирменных «джентльменских наборов», а это значит, что для его использования читателям придется устанавливать полную версию Perl из дистрибутива. К счастью, использование модуля Fcntl вовсе не является обязательным — константы LOCK_EX и LOCK_UN имеют вполне определенные числовые значения — а именно, 2 и 8 соответственно. Посему мы можем определить их в коде скрипта самостоятельно.

Для того, чтобы полностью сохранить описанный выше синтаксис вызовов функций flock() и в то же время не прибегать к использованию модуля Fcntl, необходимо до первого вызова функции flock() определить две подпрограммы:

sub LOCK_EX {return 2;}
sub LOCK_UN {return 8;}

Соответствующие параметры можно определить и как переменные. В этом случае синтаксис вызовов функции flock() немного изменится:

$LOCK_EX = 2;
$LOCK_UN = 8;

flock(OutFile, $LOCK_EX); # Блокируем файл

flock(OutFile, $LOCK_UN); # Разблокируем файл

Наконец, никто не запрещает подставить числа 2 и 8 непосредственно в качестве аргумента функции flock():

flock(OutFile, 2); # Блокируем файл

flock(OutFile, 8); # Разблокируем файл

Такой синтаксис, однако, я не рекомендовал бы использовать из соображений удобочитаемости и переносимости кода.

Для исправной работы механизма блокировки файлов код листингов 4.3, 4.4, 5.2 и 5.7 нашей книги, а также содержимое соответствующих файлов компакт-диска, необходимо немного видоизменить с учетом сказанного выше. Иначе строки с вызовами функции flock() в упомянутых примерах будут представлять собой мертвый груз, никак не влияющий на работу скриптов.

Проверить, работает ли блокировка, можно, например, следующим образом:

flock(OutFile, LOCK_EX) || print "Не удается заблокировать файл";

Если при вызове функции flock() произойдет ошибка, в стандартный вывод в данном случае будет отправлено соответствующее текстовое сообщение.

Перечень обнаруженных опечаток

Где Напечатано Следует читать
С. 32 Cookies дают возможность в определенной мере преодолеть описанный выше недостаток протокола HTTP, но использование их как единственное решение в ответственных целях связано с риском вследствие того, что cookies не являются штатной возможностью протокола HTTP. Cookies дают возможность в определенной мере преодолеть описанный выше недостаток протокола HTTP, но использование их как единственного решения в ответственных целях связано с риском вследствие того, что cookies не являются штатной возможностью протокола HTTP.
С. 76 <!--#exec cmd="copy C:\data\data txt D:" --> <!--#exec cmd="copy C:\data\data.txt D:" -->
С. 120 @array = split(' ,', $string); @array = split(', ', $string);
С. 146 В первой строке функция split() используется для того, чтобы разбить строку $query вида параметр_1=значение_1&параметр_2=значение_2&…&параметр_N=значение_N на массив элементов @query: параметр_1=значение_1, параметр_2=значение_2, , параметр_N=значение_N, руководствуясь разделителем — символом амперсанда (&). В первой строке функция split() используется для того, чтобы разбить строку $query вида параметр_1=значение_1&параметр_2=значение_2&…&параметр_N=значение_N на массив элементов @query: параметр_1=значение_1, параметр_2=значение_2, …, параметр_N=значение_N, руководствуясь разделителем — символом амперсанда (&).
С. 191 Атрибут B функционально зависит от атрибута A (обозначается: A>B), если в любом состоянии сущности каждому значению A соответствует в точности одно значение B. Атрибут B функционально зависит от атрибута A (обозначается: A→B), если в любом состоянии сущности каждому значению A соответствует в точности одно значение B.
С. 191 Если одновременно существуют функциональные зависимости A>B и B>A (важно понять, что второе в общем случае никак не следует из первого!), то между атрибутами A и B имеется взаимно-однозначное соответствие или, иначе, функциональная взаимозависимость (обозначается: A-B или B-A). Если одновременно существуют функциональные зависимости A→B и B→A (важно понять, что второе в общем случае никак не следует из первого!), то между атрибутами A и B имеется взаимно-однозначное соответствие или, иначе, функциональная взаимозависимость (обозначается: A↔B или B↔A).
С. 208 Допустим, вы скопировали директорию \soft\ready-to-use-2\mysql с компакт-диска в корневой каталог диска C. Допустим, вы скопировали директорию \soft\ready-to-use-2\mysql с компакт-диска в корневой каталог диска C:.
С. 211 Каждая команда, адресованная клиенту MySQL, должна оканчиваться символом двоеточия (исключая сокращенные версии служебных команд, предваряемые символом обратной косой черты — «\»). Каждая команда, адресованная клиенту MySQL, должна оканчиваться символом точки с запятой (исключая сокращенные версии служебных команд, предваряемые символом обратной косой черты — «\»).
С. 226 Если же указать в качестве параметра длина типа VARCHAR большее значение, нежели 65 536, ошибки не произойдет — тип данных соответствующего столбца будет автоматически преобразован к типу MEDIUMTEXT, позволяющему хранить свыше 16 млн символов в каждом поле столбца. Если же указать в качестве параметра длина типа VARCHAR большее значение, нежели 65 535, ошибки не произойдет — тип данных соответствующего столбца будет автоматически преобразован к типу MEDIUMTEXT, позволяющему хранить свыше 16 млн символов в каждом поле столбца.