.


Введение

Если вы имеете свой Web-узел, вам может понадобиться установка такой программы на вашем сервере, которую могли бы запускать посетители вашего узла. Большинство бесплатных служб Web не предлагают такую возможность, но почти все платные охотно идут на это. Если они рекламируют такие услуги как "cgi-bin", "Perl", "C" и т.п., то очень похоже, что и ваши программы Euphoria тоже смогут исполняться на их сервере. При этом интернет-компания вовсе не должна устанавливать у себя Euphoria специально для вас. Вы очень легко можете сделать это для себя сами. Если ваш провайдер не возражает, вы просто запускаете на его сервере программу, написанную на C, а именно, обычный интерпретатор Euphoria.

Специальный протокол, который называется CGI (Common Gateway Interface), поддерживается почти всеми платными Web-серверами, и вы можете использовать почти любой язык программирования, чтобы разрабатывать приложения CGI. В настоящее время для целей CGI очень популярен язык Perl, но Euphoria для таких задач подходит даже лучше, чем этот знаменитый Perl. По сравнению с программами Perl, программы Euphoria стартуют и исполняются быстрее, а также имеют лучшую диагностику ошибок. По сравнению с C, программы Euphoria отнимают меньше усилий на разработку, их легче изменять и отлаживать. Euphoria также значительно проще в отношении обработки строк, что часто очень важно в программировании CGI.


Протокол интерфейса CGI (Common Gateway Interface - Общие ворота)

CGI - это очень занятный акроним для очень простого протокола. Стандарт CGI определяет порядок, в соответствии с которым браузер Web посылает информацию в исполняемую на Web-сервере программу, а эта программа посылает информацию обратно браузеру Web.

Серверы Web.

Если у вас имеется необходимое серверное программное обеспечение, и нет возражений со стороны вашего Интернет-провайдера, вероятно, вы сможете запускать программы Euphoria прямо на вашей собственной (домашней) машине.

Тем не менее, большинство людей должно будет воспользоваться услугами провайдера, чтобы организовать для себя CGI. Такие услуги могут стоить от $3 U.S. в месяц до $50 или даже больше.

Узел RapidEuphoria.com содержится на сервере действительно надежного провайдера (addr.com), и нам это обходится всего в $10 U.S. за месяц. За эту плату мы получаем 3000 Mb дискового пространства на машине с операционной системой FreeBSD, и 60 Gb квоты отгрузок в месяц. Но до самого последнего времени, по той же цене, нам предоставляли только 150 Mb пространства и 15 Gb квоты. Квота отгрузок определяет число байтов, которые могут быть приняты с нашего узла пользователями за каждый месяц.

Форум EU (наш домен OpenEuphoria.org) содержится даже на еще более дешевом сервере Linux (host-web-site.com) за $4 в месяц. У него 200 Mb пространства и 5 GB квоты. Но не так давно это стоило $18 в месяц, так что цены на содержание Интернет-ресурсов, как видно, пока идут вниз.


Установка Euphoria для CGI

Установка Euphoria на несущую машину очень проста. Вы должны просто загрузить каталог euphoria для той операционной системы, которая исполняется на несущей машине (несущая машина иначе называется хост). Вы можете поставить каталог euphoria на высшем уровне своего собственного персонального пространства. Нет никакой необходимости менять что-либо в системе в целом. Используя telnet (или ssh), вы можете поэкспериментировать и убедиться, что можете исполнять некоторые программы из каталога euphoria\demo на несущей машине. Вы должны будете установить ваши переменные EUDIR и PATH, чтобы указать на каталог euphoria. Это может потребовать некоторого редактирования файла .profile, который исполняется каждый раз, когда вы входите в систему.

Программа CGI Euphoria, которую могли бы запускать ваши посетители, как правило, должна быть размещена в специальном подкаталоге вашего каталога на сервере. Этот подкаталог называется "cgi-bin". Подкаталог cgi-bin часто бывает расположен в каталоге "public_html", который содержит все ваши публично-доступные файлы HTML. Подкаталог cgi-bin имеет специальное разрешение на запуск в нем программ, которые он содержит.

На платформах Linux и FreeBSD, а также на Windows (если система использует серверную программу Apache Web Server), вы можете задать так называемую строку "shebang" как самую первую строчку вашего главного файла программы Euphoria. Эта строчка будет показывать системе, где расположен интерпретатор Euphoria (exu или exw.exe) т.е.

#!./exu

говорит, что интерпретатор находится в текущем каталоге (cgi-bin). Если вы загрузили этот файл на Linux/FreeBSD, позаботьтесь, чтобы строчка заканчивалась символом только перевода строки (\n), но не возврата каретки-перевода строки (\r\n).

Примечание: на Windows вы должны использовать exwc.exe, а не exw.exe. Интерпретатор exwc отрабатывает стандартный вывод лучше, а это обстоятельство может сыграть решающую роль для CGI. Вы должны также задать команду "without warning" в самом начале вашего главного программного файла, так как в противном случае предупреждающие сообщения могут вызывать проблемы с правильным завершением вашей программы.

На платформах Linux/FreeBSD вы должны установить атрибут, разрешающий исполнять вашу программу CGI. Когда пользователь пытается запустить вашу программу, на сервере включается отдельный процесс, исполняющий вашу программу, и ему необходимо найти все ваши файлы Euphoria и получить к ним доступ. Вероятно, вам следует установить такие атрибуты ваших файлов, чтобы любой мог читать и запускать их, но только вы могли бы перезаписывать их, то есть, rwx r-x r-x или chmod 755 myfile.exu. Чтобы облегчить себе жизнь, вы, видимо, захотели бы скопировать все файлы, которые нужны вашей программе, в каталог cgi-bin. В этом случае следует скопировать стандартные библиотеки Euphoria из каталога euphoria\include, интерпретатор Euphoria и все файлы баз данных, к которым вы собираетесь иметь доступ. Это поможет вам избежать путаницы, если процесс на сервере не имеет тех же самых установок для переменных окружения (PATH, EUDIR), которые имеются у вас, и окажется неспособным найти ваши файлы Euphoria.


Формы HTML

Вы можете установить простую связь Web на вашу программу CGI и запускать ее, щелкнув мышью на этой связи, но обычно это делают, оформив страницу Web, содержащую какую-либо форму HTML. Такая страница снабдит ваших пользователей графическим пользовательским интерфейсом, где они смогут подавать запросы и информацию в вашу программу CGI.

На Web-узле RapidEuphoria.com имеется несколько мест, где мы используем формы HTML для связи с нашими программами CGI, написанными на Euphoria. Возможно, простейшая такая форма находится на странице Микро-Экономики: http://www.rapideuphoria.com/ecoform.htm
Вы можете воспользоваться Интернет Эксплорером, чтобы просмотреть код HTML для этой страницы. Просто вызовите Просмотр HTML-кода из меню.

Прокрутив страницу вниз, вы найдете начало кода формы:

<form method="POST" action="cgi-bin/economy.exu">

Эта строчка заставляет браузер нарисовать форму, которую пользователь должен заполнить. Когда пользователь нажмет кнопку этой формы, программа CGI, economy.exu, расположенная в cgi-bin, начнет исполняться сервером.

Возможны два "метода", которые вы можете использовать. Эта форма использует метод "POST" - "ОТПРАВИТЬ". Другой метод называется "GET" - "ПОЛУЧИТЬ".

С методом POST вводимые пользователем данные поступают на вход программы Euphoria и могут быть прочитаны с помощью функций gets() и getc().

С методом GET данные, предназначенные для программы Euphoria, приобретают форму переменной окружения, которая называется "query_string" - "строка_запроса".

Который из методов лучше? В большинстве случаев не имеет значения, какой метод вы используете, входные данные будут теми же самыми. Отличие только в том, как программа их получает.

Фактически, если вы посмотрите, как программа Euphoria обрабатывает форму Микро-Экономики: http://www.rapideuphoria.com/economy.txt,

вы увидите, что функция read_input() проверяет, какой метод был использован, и просто берет введенные данные из соответствующего источника. Не стесняйтесь использовать функцию read_input()в ваших программах CGI.

Форма собирает данные от пользователя несколькими путями. Один из простейших путей - с тегами текстового входа, как показано ниже:

< input type="text" name="name" size="35">

<input type="text" name="city" size="35">

что позволит пользователю ввести свое имя и название города в два различных окошка. Слова, которые он введет, подаются в программу Euphoria, где фигурируют с метками "name" и "city".

Итак, на что же похожи вводимые данные?

С методом GET переменная окружения query_string (для первых двух полей) будет выглядеть примерно так:

"name=John&city=Miami"

и вы сможете увидеть ее в окне адреса вашего браузера Web, после символа '?'.

С методом POST та же самая строка будет доступна через стандартный вход.

Вы должны будете проверить синтаксически этот вход, чтобы разбить его на два поля. Программа Микро-Экономики для этих дел использует функцию parse_input(). Эта функция может пригодиться вам в ваших собственных программах.

Кроме этих простых окошек ввода, существует множество других типов, доступных в HTML. Вы можете задать окошки с одной или несколькими строчками, парольные окошки (показывают звездочки вместо слова пароля), выпадающие меню, радио-кнопки, окошки с птичками и т.д. Каждое из них добавляет к данным пользователя соответствующее свое название, и ваша программа CGI должна разобрать эту информацию, используя функцию parse_input() или некоторый эквивалентный код. Вы можете даже позволить пользователю отгрузить вам большие файлы.


Вывод данных из вашей программы CGI

После проверки запроса пользователя ваша программа должна подготовить и передать пользователю ответ. Этот ответ должен быть в форме полной страницы HTML, выводимой на стандартный выход (1-ый файл Euphoria). Самая первая строка, которую ваша программа выводит на стандартный выход, должна быть:

Content-type: text/html

Эта строка должна сопровождаться серией строк, которые соответствуют полной странице HTML. Например, программа Микро-Экономики вызывает процедуру print_HTMLheader(), которая печатает:

 puts(1, "Content-type: text/html\n\n")
 puts(1, "<html><head><title>Thank You</title></head>\n")
 puts(1, "<body bgcolor=\"#FFFFFF\">\n")
Много позже, когда все это закончено, она выводит последнюю строчку, в которой написано: </body></html>, что означает конец страницы. Если программно не завершить таким образом страницу HTML, браузер пользователя может не вывести страницу правильно, если вообще что-то выведет.


Отладка программ CGI

Когда вы в первый раз запускаете вашу новую программу CGI, шансы получить все, на что вы расчитывали, совсем невелики. Скорее всего, программа так или иначе просто рухнет. Вероятно, вы увидите страницу ошибки, на которой будет совсем немного о том, что же вы сделали не так.

Первое, что вы должны сделать, так это проверить, появился ли в каталоге cgi-bin файл ex.err Euphoria. Если он там, он вам расскажет, почему ваша программа аварийно остановилась. Если там его нет, скорее всего, ваша программа просто даже не была запущена, так как не имеет соответствующего разрешения, или строка "shebang" - #! - неправильная. Или программа могла успешно завершиться, но не выпустить правильную страницу HTML. Убедитесь, что строка Content-type имеется в начале, что структура страницы правильная, начинается она с <html>, а заканчивается на </html>.

Если вы не получаете ex.err, вы можете задать генерацию файла ex.pro, поставив "with profile" в начале вашей программы. Это даст вам информацию о том, какой оператор ваша программа выполнила самым последним перед своим завершением.

Вы можете также попробовать "with trace" и trace(3), чтобы задать генерацию файла, содержащего последние 500 операторов, выполненных перед остановкой программы.

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


Ускорение программ CGI

Большинство программ CGI не занимают много процессорного времени, и основное время может уходить на старт интерпретатора и проверку синтаксиса собственно программы. Типичная программа CGI читает несколько параметров, заданных пользователем, затем считывает одну запись в базе данных или отправляет одно сообщение по электронной почте, перед тем как вывести простую страницу HTML для пользователя.

Те программы CGI, которые занимают много времени, вы можете транслировать с Euphoria на C, а затем компилировать их. Результирующий исполняемый файл может использоваться как программа CGI. Он будет и стартовать, и исполняться быстрее. Единственная проблема - вы не получите полный файл ex.err, если такая программа аварийно остановится, тем не менее, вы сможете задать crash_routine(), чтобы послать себе по электронной почте сообщение, в котором могут быть зафиксированы некоторые ключевые переменные, в частности, строка запроса, которая и привела к аварийной остановке.