Персональный сайт Артемия Ломова

Книга «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: практика создания динамических сайтов»Ломов А. Ю. 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 информационный сайт, счетчик посещаемости, лента комментариев, информационно-поисковая система, система голосования, система публикации новостей для сайта и др. Компакт-диск содержит практические примеры веб-приложений и свободно распространяемое программное обеспечение, необходимое веб-разработчику.

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

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

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

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

В разделе «Блокировка файлов» главы 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 млн символов в каждом поле столбца.