скрипты для сайта perl
Скрипты для сайта perl
Давайте разберем подробнее скрипт, который мы использовали для проверки работы Perl:
Обратим внимание на то, что каждая строка (кроме первой) должна заканчиваться точкой с запятой (;)
|
Она заставляет веб-сервер искать Perl-интерпретатор perl.exe в директории C:\USR\bin\. Строка может варьироваться в зависимости от того, где у вас расположен интерпретатор Perl.
Если вы указали путь неправильно, Apache выдаст непонятное сообщение об ошибке, а в errors.log появится сообщение: «couldn’t spawn child process». В этом случае проверьте первую строку в скрипте.
|
Попробуйте убрать из Perl-скрипта, предназначенного для вывода веб-страницы на браузер, строку:
print «Content-type: text/html\n\n»;
Почему Perl требует, чтобы эта строка предшествовала выводу информации на браузер? Попробуем разобраться, воспользовавшись бесплатной утилитой HttpRevealer. Эта небольшая программа для веб-разработчиков позволяет увидеть диалог между браузером и веб-сервером.
Установим эту программу и введем в браузер адрес сайта, например, http://dmoz.org/.
Как только вы нажмете «Enter», ваш браузер подключится к серверу (в данном случае, это dmoz.org.) и запросит главную страницу сайта. Получив запрос браузера, веб-сервер отвечает ему, возвращая главную страницу сайта. Просто, да?
Создается впечатление, что браузер и веб-сервер разговаривают друг с другом? Так и есть! Они говорят так же, как это делаем мы. Но разговаривают они не на человеческом языке, а на языке команд HTTP-протокола.
Давайте посмотрим, что они «говорят»:
Выше приведен скриншот HttpRevealer. Верхняя панель отображает запрос браузера, а нижняя панель показывает ответ веб-сервера.
Не пугайтесь незнакомых слов. Сейчас мы все объясним. Если вы посмотрите на первую строку HTTP-запроса в верхней панели, то увидите:
GET / HTTP/1.0 |
По-русски это означет: «Эй, господин веб-сервер, я пришёл, чтобы получить документ, расположенный в корневом каталоге вашего сайта. Я общаюсь с вами по HTTP-протоколу версии 1.0». «.
Теперь, посмотрите, что отвечает веб-сервер:
HTTP/1.1 200 OK . Content-Type: text/html Вот так все просто! Но не стоит забывать, что мы смотрим этот диалог для того, чтобы выяснить, почему Perl требует наличия в скрипте строки «print Content-type», для того, чтобы он работал правильно. Начинаем работать с PerlКак вы видите, каждое выражение заканчивается точкой с запятой, строка заключается в апострофы. Одна из первых вещей, которые необходимо запомнить, как и в некоторых других языках, это то, что важен тип кавычек; если вы используете одиночные кавычки (апострофы), то выражение внутри трактуется как строка текста; если вы используете двойные кавычки, то в выражении можно использовать специальные символы и переменные. Например, напишем следующий код: В результате будет выведена строка «$a\n’» Если использовать код то с новой строки будет выведена сообщение «hello world» Всегда проверяйте правильность строк внутри двойных кавычек. В системе Linux вы можете первой строкой написать #!/usr/bin/perl и использовать команду chmod для того чтобы сделать файл скрипт выполняемым. Тогда для запуска скрипта вам нужно будет только написать его имя, например ./scriptname.pl. Обычно строки, начинающиеся со знака # являются комментарием, но первая строка в *nix указывает системе интерпретатор скрипта. Программирование, как правило, включает блоки данных или команд, которые используются внутри циклов, и Perl не является исключением. Фактически он был спроектирован для работы с текстовыми файлами, то есть читает информацию находящуюся внутри них или со стандартного ввода (набор на клавиатуре) или из списка файлов в командной строке. Вот простой пример скрипта: Сохраните файл как test.pl и запустите его используя следующую команду: Второй test.pl можно заменить именем любого другого текстового файла. Взглянув на скрипт, можно увидеть блоки команд в цикле, заключенные в фигурные скобки. Для задания условий в цикл while используются значки <>. Специальное указание «<>» означает что используется стандартный ввод, а специальная переменная «$_» означает текущую строку ввода. Таким образом, скрипт читает строку со стандартного ввода и выводит её. Если вы просто наберете perl test.pl, он будет ожидать пока вы наберете какую-нибудь строку и затем выведет её, и так будет продолжаться пока вы не нажмете Ctrl & D, что будет означать конец скрипта. » сравнивает совпадают ли переменные, а оператор «! » проверяет несовпадение. Добавть в конец скрипта следующий строки и запустите его командой perl test.pl test.pl: Результатом будут две строки кода и перед каждой примерно такое сообщение: «Fred is here, line 7.» Теперь нас есть простой скрипт, который ищет в файле слово «Fred», но для чего мы можем его использовать? Например, его легко встроить в какой-нибудь полезный CGI скрипт, скажем, для поиска строки в таблице данных. Давайте используем некоторые данные: составим простую таблицу с контактными номерами телефонов. Она будет содержать имя человека, и два номера. Сохраним файл в формате CSV, и загрузим его на сервер в ту же директорию, в которой будет наш скрипт. Мы создадим скрипт для извлечения строки, содержащей данные человека, которого необходимо найти. Скрипт в конце содержит полный код. Сначала мы посылаем заголовок, чтобы сказать веб браузеру, что передается простой текст; как и в других заголовках, это необходимо сделать c новой строки, и затем добавить пустую строку, показывающую конец заголовка и начало содержимого веб страницы. Затем команда open читает файл, расположенный в той же директории, что и скрипт, CSV файл, который мы создали в Excel; в качестве идентификатора файла используется имя «CONTACTS». Его мы будем использовать в цикле while для чтения файла. Поскольку все данные разделены запятой, мы можем записать их в различные переменные. Первая команда next if нужна для пропуска следующей итерации цикла; мы убеждаемся, что не выведем строку, содержащую заголовок, который Excel добавляет в CSV файл. Вторая команда используется для нескольких вещей; здесь есть сравнение, с которым мы знакомились раньше, но в конце используется маленькая буква i, которая заставляет Perl игнорировать блок. Эта часть проверяется на совпадение и пропускаются все строки, кроме совпадающих, скрипт завершает работу, выдав все контакты, которые найдет. Чтение списка контактов из CSV файла с помощью Perl Perl и CGI-программы – особенности использованияРазработчики сайтов и администраторы нередко сталкиваются со скриптами CGI (микросценариями обработки текстовых данных). Они применяются при создании интерактивных страниц, содержание которых зависит от действий пользователя. Например, это могут быть формы регистрации или отправки комментариев. Также есть «невидимая» область применения – сбор и обработка информации о посетителях при помощи файлов cookies. Что такое CGI и PERLВажно понимать, что CGI – не язык программирования, а протокол передачи данных веб-серверу через stdin и их прием из stdout. В качестве обработчика команд используется любая программа с поддержкой функций потокового ввода-вывода. Например, написанная на языке Perl. Главное, что от скрипта требуется «умение» заполнять таблицы в базе данных и получать данные из них путем подачи запроса, чего никогда не сделать средствами HTML. Особенности применения языка Perl: В качестве альтернативы Perl все чаще применяется язык программирования Python, но администраторы «старой закалки» продолжают придерживаться классики создания CGI-скриптов, так как поддержка Perl «по умолчанию» имеется в большинстве дистрибутивов Linux. Поэтому программы на нем начинают работать без предварительной подготовки сервера. Формально же скрипты можно писать на чем угодно – хоть на C/C++, Pascal, Java или Visual Basic. Использование готовых скриптовЕсли CGI-скрипт уже готов (используется стандартный модуль), перед использованием его нужно скопировать на сервер хостинга. Выполняется процедура при помощи файлового менеджера в панели управления или через FTP-доступ, например программой FileZilla. Выбор расположения остается на усмотрение пользователя; к программе можно обращаться независимо от имени каталога или подкаталога, но рекомендуется придерживаться определенных стандартов. Так, внутри скриптов обязательно указывается путь к интерпретатору используемой платформы для программирования: Если здесь допустить ошибку, программный код исполнятся не будет. То же происходит, если в ПО предусмотрено обращение к базе данных MySQL – пользователю понадобится внести в программу путь к ней, логин и пароль доступа. При изменении последнего корректировка CGI-скрипта обязательна, иначе он перестанет работать. Местоположение файлов в популярных CMS выясняется в службе технической поддержки или в служебной документации. Написание простейшего CGI-скриптаПри работе в среде операционной системы Windows для написания кода понадобится специальная программа. Например, подойдет специализированный текстовый редактор Notepad++ (стандартный Блокнот для таких целей не подходит). Сам код строится вокруг переменных окружения и потоков ввода-вывода информации. По сути, CGI-скрипты являются обработчиками отдельных команд и не являются «полноценной» программой. Главное, избегать использования SHELL, который снижает безопасность сайта. В качестве примера простейшего CGI-скрипта приведем код для вывода текущей даты и команду HTML, при помощи которой будет происходить обращение к программе (из любой части страницы, хоть в нескольких местах одновременно). При помощи специального виджета, установленного в CMS, или путем ручного редактирования шаблона в нужный участок HTML вставляется код: В приведенном примере решена типовая ошибка новичков. Она заключается в отсутствии метки о типе выводимого результата (строка Content-type: text/html). После нее располагается пустая строка для указания, что следом идет непосредственно программный код. Просмотр установленных модулей PERLПроверить ранее подключенные PERL-модули можно командой vim. Перед ее вводом необходимо подключиться к серверу хостинга по защищенному каналу SSH. После авторизации нужно ввести в консоли: В результате будет создан файл с указанным названием. Следующий шаг – открыть его в текстовом редакторе и изменить содержимое на следующий код: Perl’ы для веб-мастераЧтобы решить основные задачи, стоящие перед вебмастером, без необходимости многомесячного изучения языков программирования, мы опустим длительное обучение теории и сразу перейдем к практике. Учиться будем в процессе создания скриптов, которые вы сможете опробовать на своем сайте. Что необходимо знать о сервереПрежде чем писать CGI-скрипты, необходимо узнать некоторую информацию о сервере, на котором эти скрипты будут работать. Всю эту информацию можно получить у провайдера, где находится сайт. Бесплатные службы, предоставляющие место под страницы, обычно размещают такую информацию в своих «хелпах», в разделах, посвященных CGI и т. п. Адреса серверов, которые разрешают выполнение CGI-скриптов, мы публиковали в прошлом номере МК. Наиболее важный параметр из тех, что необходимо знать — путь к интерпретатору Perl на сервере, который следует указывать в первой строке каждой программы, написанной на Perl. Обычно она имеет вид: Такую строку мы будем использовать в дальнейших примерах. Чтобы скрипт имел возможность отправлять письма, понадобится узнать путь к почтовой программе (sendmail). Он может выглядеть примерно так: ИнструментыДля написания скриптов на Perl’е, не обязательно устанавливать какой-либо специальный софт — подойдет и любой текстовый редактор, тот же «Блокнот», входящий в состав Windows. Но все-таки упомяну пару инструментов, которые помогут упростить написание и отладку скриптов. Прежде всего, понадобится интерпретатор Perl для Windows, который можно загрузить со страницы http://www.activestate.com/ActivePerl/download.htm (либо выбрать другие варианты адресов с сервера http://www.perl.com/). А для программирования и отладки самый удобный, на мой взгляд, инструмент — это Perl Builder (http://www.solutionsoft.com/). Кроме пошаговой отладки с возможностью просмотра по ходу значений переменных, имеется функция автоматической генерации некоторых скриптов. А вообще, существует достаточно много различного программного обеспечения, которое помогает в создании и отладке программ на Perl — мы обязательно с ним ознакомимся в дальнейшем. Создаем счетчик посещенийЕсть множество рейтингов, предоставляющих счетчики посешений, собирающих статистику. Взамен они требуют установить у вас на сайте свою кнопку. Но что делать, если вы не гонитесь за высоким положением в рейтинге и не желаете вставлять в свою страницу кнопку рейтинга? Вам просто нужно считать посетителей и собирать некоторую статистику. Или почему бы не проконтролировать правильность информации, собранной чужим счетчиком? А может, вы хотите создать собственный рейтинг? ОК, давайте сделаем сначала простейший счетчик, а затем превратим его в систему сбора статистики и удобного просмотра собранной информации. А заодно и научим генерировать картинку счетчика. Начнем с простейшего текстового счетчика. Правда, чтобы он работал, необходима поддержка сервером инструкций SSI (Server Side Includes) — об этом также узнайте у хостинг-провайдера. Создайте в текстовом редакторе два файла и сохраните их на своем диске с именами count.cgi и count.txt соответственно. Второй из них пусть будет пустым, а в первом наберите следующий текст: Теперь с помощью FTP-клиента скопируйте оба файла в cgi-bin-директорию своего сервера. Отметим, что делать это надо в режиме ASCII. После этого установите права доступа (команда CHMOD) для count.cgi — 755, а для count.txt — 666. Осталось вставить вызов скрипта в HTML-страницу. В том месте страницы, где вы хотите увидеть счетчик посещений вставьте строку: где /cgi-bin/count.cgi — полный путь к файлу скрипта от корневой директории вашего сайта. Т. е. если полный путь к скрипту выглядит как http://your-domen.com/cgi-bin/count.cgi, то в вызове скрипта пишем /cgi-bin/count.cgi. Теперь можно загрузить страницу на сервер и открыть ее в браузере. Вы увидите цифры — показания счетчика, увеличивающиеся при каждом вызове страницы. Осталось разобраться, что же мы такое сделали. Чтобы вы хоть немного могли понимать, о чем идет речь, предлагаю некоторые начальные сведения о том, «что есть что в Perl». Итак, о том, что первая строка скрипта указывает, где искать интерпретатор Perl, вы уже знаете. открывает файл count.txt для чтения, связывая название файла с дескриптором COUNTFILE; если в конце считанной строки присутствует символ перевода строки (в Perl имеет вид » «) — он будет удален. В нашем случае такого символа нет. Но лучше перестраховаться, чем потом искать непонятные ошибки. увеличиваем значение счетчика на единицу. Эту операцию можно также записать вот так: но для наглядности будем использовать предыдущий вариант. откроем файл count.cgi для записи, уничтожив (символ «>») его содержимое запишем в файл новое значение счетчика передаем новое значение счетчика в качестве результата работы скрипта, чтобы сервер включил это значение в состав HTML-страницы — в том месте, где находится строка конец выполнения программы (без этого можно обойтись, но почему бы не следовать традициям). Небольшие усовершенствования нашего счетчикаТеперь точность показаний счетчика стала немного выше. Но как он поведет себя, если на нашу страницу зайдет одновременно два посетителя? Одновременно два процесса попытаются произвести запись в файл с показаниями счетчика, в результате чего все данные файла могут быть потеряны. Чтобы этого не допустить, необходимо запретить одновременный доступ к файлу нескольких процессов. Сделать это можно с помощью функции flock, которая позволяет заблокировать файл, связанный с дескриптором, от доступа из других скриптов. Немного изменим процесс работы с файлом count.txt: Теперь поясненим наши действия. быстрое создание веб-приложений на Perl: вводнаяСейчас сложилась такая ситуация, что язык Perl незаслуженно забыт. Хочу немного поднять авторитет этого чудесного языка своими заметками. Хочется рассмотреть простую ситуацию, которая по моему мнению, часто имеет место быть при разработке малых и средних проектов. А ситуация такая: необходимо создать небольшой (средний) сайт, причем принимается решение отказаться от CMS, так как движок нужен небольшой, наворотов в админке не нужно, сложность примерно 16-24 человеко/часов. Для примера требуется небольшой сайт, который будет содержать статьи определенного типа (обычные текстовые статьи) и новости. Плюс небольшая админка для добавления статей и новостей. Условимся, что у нас есть «большая» разница между этими двумя типами контента в рамках этой статьи. ПроблемаВ таких ситуациях довольно часто принимается решение написать свой велосипед, то есть движок. Рассмотрим именно такую ситуацию, на примере которой рассмотрим так же прелести Perl и CPAN. Ничего военного, сюда вносятся глобальные параметры проекта и экспортируются. ДанныеСтруктура БДВернемся к движку. Пункт первый — это работа с данными, за нее у нас будет отвечать пакет DBIx::Class, который включает несколько модулей. Для начала создадим простую БД, с которой мы будем работать. Не стоит критично относится к структуре базы, она максимально простая, так же синтаксис без всего лишнего, минимизируем затраты. create table categories ( create table articles ( create table news ( Таблица пользователей содержит самые основные данные (учет посещений и прочих нас пока не волнует), таблица categories содержит разделы статей, например «автомото», «спорт», «кулинария» и т.п., таблица articles содержит собственно статьи, а таблица news — новости. В последней есть поле is_put_on_main, которое отвечает за показ новости на главной. Так же почти в каждой таблице я задаю кодировку — это привычка, кто уверен — не делайте. Отображение в кодХорошо, таблицы у нас есть, теперь необходимо отобразить их в коде. Модуль DBIx::Class позволяет полностью отойти от написания SQL-кода и общаться с таблицами, как с объектами. Работать с этим модулем можно двумя способами: либо вручную описывать структуры каждой таблицы, либо воспользоваться автоматикой. Рассмотрим оба способа по порядку. Ручной методСмотрим в код, далее будут пояснения. Создадим в корне нашего проекта папку с именем DB и в ней создадим четыре файла: User.pm, Category.pm, Article.pm, News.pm, вот содержимое этих файлов. use base qw/DBIx::Class/; __PACKAGE__->load_components(qw/PK::Auto Core/); # file Category.pm use base qw/DBIx::Class/; __PACKAGE__->load_components(qw/PK::Auto Core/); # file Article.pm use base qw/DBIx::Class/; __PACKAGE__->load_components(qw/InflateColumn::DateTime PK::Auto Core/); __PACKAGE__->belongs_to(‘category’ => ‘DB::Category’, # file News.pm use base qw/DBIx::Class/; __PACKAGE__->load_components(qw/InflateColumn::DateTime PK::Auto Core/); __PACKAGE__->belongs_to(‘user’ => ‘DB::User’, 1; Итак, небольшие пояснения. Имеем четыре очень похожих файла, сначала объявляем базовым модуль DBIx::Class, далее используя механизм __PACKAGE__ вызываем его методы, а именно: load_components — загружаем компоненты для нашего модуля (PK::Auto для работы с автоинкрементированными primary_key, Core — основной набор для работы со связями, строками и столбцами). Далее указываем таблицу, после чего добавляем названия столбцов. Для работы со столбцами таких типов, как datetime, date и timestamp используется небольшой модуль InflateColumn::DateTime. С помощью него поля указанных типов можно использовать в программе, как объекты типа DateTime, со всеми вытекающими удобствами. После чего указываем primary key (если он составной, то указываем несколько полей set_primary_key(qw/name1 name2/);. Теперь нам нужно использовать сие чудо, для этого нам нужен модуль DBIx::Class::Shema, который является абстракцией схемы данных. В корневой папке проекта создаем файл с именем, идентичным имени папки с классами, описывающими таблицы, в нашем случае это будет DB.pm Вот как он выглядит у меня. use base qw/DBIx::Class::Schema/; Автоматический методВ «ручном» примере мы вручную задавали все связи между таблицами. Существует модуль DBIx::Class::Shema::Loader, который выполняет загрузку и создание классов автоматически. Для этого необходимо добавить в структуру БД описание внешних ключей (foreign keys). Используя их загрузчик автоматически создаст необходимые связи. Вот как это выглядит: __PACKAGE__->loader_options( Использование схемыТеперь посмотрим, как это все вместе используется непосредственно в коде. # Удаление статьи Далее, покажем наши данные. ОтображениеЯ использую систему шаблонов Template Toolkit. Есть еще несколько систем, например Mason, но так исторически сложилось, что мой выбор пал на Template Toolkit. use CGI; Итак, подробно описывать не имеет смысла, так как все довольно явственно. Единственное, это использование параметров rows/page. Они необходимы для создания так называемых pager-ов, с помощью которых удобно организовывать постраничный вывод, а так же применяются для простого отбора записей, что является частным случаем. Так же кол-во статей и новостей можно вынести в конфиг. Далее, изменим шаблон start_page: Новости[% FOREACH n = news %] [% n.content FILTER html %] Статьи[% FOREACH a = articles %] Раздел: [% a.category.name %] [% END %] Отмечу использование поля added_at, как объекта. Для него вызывается метод dmy(), который форматирует дату в формат ДД-ММ-ГГГГ с переданным разделителем, в нашем случае точка. Объект DateTime поддерживает локали и корректно отображает дату в зависимости от текущей (или выбранной) локали. Так же он содержит множество методов для форматирования и работы с датами. Я пока намеренно не добавлял валидные ссылки, сделаю это позже. [% IF note.category %] Теперь наш шаблон start_page примет такой вид: НовостиСтатьи[% FOREACH a = articles %] Теперь мы вызываем обработку шаблона short_note и передаем ему в качестве параметра note текущую новость или статью. В шаблоне выполняется проверка на наличие поля category, что у нас будет признаком статьи, в этом случае мы выводим название раздела. На нашем портальчике так же необходимы шаблоны для отображения полной статьи или новости, отображение списка категорий статей, поисковая форма и результаты поиска. В целом, добавится еще несколько шаблонов, которые мало чем будут отличаться от вышеприведенных в плане сложности. Управлениеs/\D//g if ($p<'id'>); То есть, если у нас есть какой-то номер, будь то статьи, новости или каталога, то мы вырежем оттуда все не-цифры. Простой и дубовый метод. АдминистрированиеДля администрирования необходимо создать некий инструмент. С точки зрения модели построения админка ничем не отличается от вышеприведенной системы, кроме авторизации и нюансов с текстом. Рекомендутеся создать отдельную папку для шаблонов, например tmpl/admin. Шаблоны: В скрипте админки нужно дописать вход и выход из системы, а так же сессии: Следующий нюанс касается создания форм для ввода данных. Во-первых, необходимо создать так называемые CRUD-методы (CReate, Update, Delete). Для этого, например, существует модуль DBIx::Class::WebForm. Так же по запросу CRUD на CPAN можно найти еще несколько подобных модулей. ЗаключениеВ этой «небольшой» заметке я хотел поделиться своим небольшим опытом в создании простых приложений. Заметка вышла не маленькая, но, надеюсь, информативная. Приведенный здесь метод создания приложений очень эффективен в плане повторного использования, единожды созданные кусочки сайта можно потом использовать в других местах, почти ничего не меняя. Так же мы достаточно эффективно разделили вид и код, а так же абстрагировались от непосредственного написания SQL-запросов.
|