Книга «Apache, Perl, MySQL: практика создания динамических сайтов»
Эту книгу можно рассматривать как второй том, закономерное логическое продолжение вышедшей ранее моей книжки «HTML, CSS, скрипты: практика создания сайтов». Книга адресована веб-разработчикам, уже имеющим за плечами опыт создания сайтов с применением базовых технологий стороны клиента — HTML, CSS и, возможно, JavaScript, но осознавшим необходимость двигаться дальше, научиться эффективно использовать в своей практике серверные решения.
Книга призвана помочь начинающим веб-технологам уверенно и безболезненно преодолеть пресловутый барьер между «статикой» и «динамикой», в силу объективных причин кажущийся многим новичкам весьма высоким. Свою задачу я, однако, вижу вовсе не в том, чтобы провести читателя по пути наименьшего сопротивления, заботливо сгладив перед ним все неровности почвы и усыпав дорогу лепестками роз. Я планировал сделать совсем другое — а именно, наделить читателя силами, которые позволят ему самостоятельно взять новую высоту. Пошаговые инструкции, шаблонные решения, необоснованные упрощения — не мой стиль. Название серии, в которой вышла книга — «Самоучитель» — не должно смущать потенциального читателя. На традиционные самоучители моя книга совсем не похожа.
Первостепенное внимание в книге уделяется фундаментальным принципам, лежащим в основе функционирования динамических веб-технологий стороны сервера. Я стремлюсь привить читателю, в первую очередь, глубокое и всестороннее понимание того, что с чем и как взаимосвязано. Это должно позволить читателю в будущем свободно, без каких бы то ни было затруднений работать с техническими спецификациями и специализированной справочной литературой.
Искусство и наука создания динамических сайтов раскрывается в моей книге, главным образом, на примере следующих технологий и программно-инструментальных средств: протокол HTTP; веб-сервер Apache 1.3x; включения на стороне сервера 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-машине все условия для веб-разработки с использованием технологий стороны сервера.
Купить книгу можно в интернет-магазинах Bolero, Books.Ru, Ozon.Ru и «Библион», а также в офлайновых книжных магазинах Москвы, Санкт-Петербурга и других крупных городов.
При желании вы можете оставить отзыв на мою книгу на сайте издательства.
Обложка, выходные данные и аннотация
Ломов А. Ю. Apache, Perl, MySQL: практика создания динамических сайтов. Самоучитель. — СПб: БХВ-Петербург, 2007. — 368 с.: ил.
ISBN 978-5-94157-900-6
Рассматриваются классические технологии и программно-инструментальные средства, применяемые для разработки динамических веб-приложений, функционирующих на стороне сервера. Обсуждаются протокол HTTP 1.1, веб-сервер Apache 1.3x, технология SSI, реализованная в Apache, интерфейс CGI, язык программирования Perl 5, СУБД MySQL 4.x — 5.x. Изложение сопровождается многочисленными примерами: небольшой автоматизированный при помощи SSI информационный сайт, счетчик посещаемости, лента комментариев, информационно-поисковая система, система голосования, система публикации новостей для сайта и др. Компакт-диск содержит практические примеры веб-приложений и свободно распространяемое программное обеспечение, необходимое веб-разработчику.
Для веб-разработчиков.
Подробное оглавление
- Введение
- Цели, задачи и особенности этой книги
- Для кого предназначена книга
- Чему научит книга
- Краткий экскурс по главам и приложениям
- Обзор компакт-диска
- Благодарности
- Глава 1. Механизмы функционирования динамических сайтов
- Описание протокола HTTP
- Этапы HTTP-транзакции
- Формат HTTP-сообщений
- Строка запроса
- Статусная строка
- Заголовки HTTP-сообщений
- Практическое исследование заголовков реальных сообщений
- Заголовок запроса
- Заголовок ответа
- Практическое исследование заголовков реальных сообщений
- Некоторые полезные расширения протокола HTTP
- Поле заголовка Refresh
- Cookies
- Использование тега <meta> для эмуляции HTTP-заголовков
- Динамические технологии стороны сервера — интерактивность без компромиссов
- Устройство динамического сайта
- Описание протокола HTTP
- Глава 2. Знакомство с веб-сервером
- Установка и запуск Apache
- Компоненты веб-сервера Apache
- Конфигурация сервера
- Синтаксис директив конфигурации сервера
- Знакомство с файлом httpd.conf
- Директивы общей конфигурации сервера
- Директивы конфигурации основного узла
- Типовые задачи и их решение
- Файлы управления доступом
- Кодировка по умолчанию
- Список индексных страниц
- Обработка директив SSI
- Страница с сообщением об ошибке
- Закрытая область узла
- Виртуальные узлы
- Настроенный сервер
- Глава 3. Использование включений на стороне сервера SSI
- Сущность включений на стороне сервера
- Синтаксис директив SSI
- Вставка содержимого одного документа в другой — типичное использование SSI
- Исполнение CGI-скриптов, программ и системных команд
- Вывод размера и времени модификации файла
- Переменные окружения
- Пользовательские переменные
- Обработка условий
- Практический пример — автоматизация статического сайта при помощи SSI
- Глава 4. Создание динамических веб-приложений с использованием общего шлюзового интерфейса CGI и языка программирования Perl
- Возможности и особенности CGI
- Язык Perl — основное средство разработки CGI-скриптов
- Простейший скрипт на Perl
- Запуск CGI-скриптов в среде UNIX
- Путь к интерпретатору Perl
- Переходы на новую строку
- Права доступа
- Запуск CGI-скриптов в среде UNIX
- Знакомство с 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
- Практический пример — система публикации новостей для сайта
- Состав проектируемого веб-приложения
- Изменения в коде страниц, шаблонов и листов стилей исходного сайта
- Главная страница панели управления и файлы управления доступом
- Настройка параметров подключения к базе данных
- Подготовка приложения к работе
- Скрипт перестройки таблицы
- Скрипт добавления данных
- Скрипт просмотра новостей
- Скрипт выбора новостей для редактирования и удаления
- Скрипт редактирования новостей
- Скрипт удаления новостей
- Вместо заключения
- Связь CGI-скриптов с базами данных
- Приложения
- Приложение 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=зна- на массив элементов @query: параметр_1=значение_1, параметр_2=значение_2, , параметр_N=значение_N, руководствуясь разделителем — символом амперсанда (&). |
В первой строке функция split() используется для того, чтобы разбить строку $query вида параметр_1=значение_1&параметр_2=зна- на массив элементов @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 млн символов в каждом поле столбца. |