Главная Случайная страница


Полезное:

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


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






I-3. Технология CGI





В предыдущей главе мы с вами разобрались, как создать HTML-форму, и как браузер отправляет введенные в нее данные на сервер. Но пока что непонятно, что будет сервер делать с этими данными.

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

Взглянем на этот URL: http://www.example.com/cgi-bin/form_handler.cgi. Первое предположение, которое можно сделать на его счет, обычно такое: сервер отдает содержимое файла form_handler.cgi из каталога cgi-bin. Однако, в случае с технологией CGI дело обстоит по-другому. Сервер запускает программу form_handler.cgi и передает ей данные формы. Программа же формирует текст, который передается браузеру в качестве ответа на запрос.

Программу form_handler.cgi можно написать на любом языке программирования, главное - соблюдать в программе стандарт CGI. Можно использовать, например, популярный скриптовый язык Perl. А можно написать все и на Си. Или на shell-скриптах... Но мы, для примера, напишем эту программу на Си. Но сначала разберемся, как происходит обмен данными между веб-сервером и CGI-программой.

  • Перед запуском CGI-программы, сервер устанавливает переменные окружения (вам они наверняка знакомы по команде PATH). В каждый мало-мальски серьезном языке программирования есть средства для чтения переменных окружения. Стандарт CGI определяет весьма значительный набор переменных, которые должны быть определены перед запуском CGI-программы. Рассмотрим сейчас только три из них:
    • REQUEST_METHOD - метод передачи данных - GET или POST (есть и другие, но пока мы их не рассматриваем)
    • QUERY_STRING - содержит часть URL после вопросительного знака, или, другими словами, данные GET-формы.
    • CONTENT_LENGTH - длина тела запроса (данные POST-формы).
  • Сервер запускает CGI-программу. Тело запроса передается программе в виде стандартного ввода (stdin) - будто бы эти данные были введены с клавиатуры.
  • Программа выдает ответ броузера на стандартный вывод (stdout) - "на экран". Этот вывод перехватывается веб-сервером и передается браузеру.
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(void)
  4. {
  5. // Читаем переменные среды, установленные веб-сервером
  6. char *query_string = getenv("QUERY_STRING");
  7. char *request_method = getenv("REQUEST_METHOD");
  8. char *post_data; // Буфер для данных POST-запроса
  9. int post_length = 0; // Длина тела запроса
  10. if (strcmp(request_method, "POST") == 0) { // Если получен POST-запрос,
  11. post_length = atoi(getenv("CONTENT_LENGTH")); // сначала читаем из
  12. // переменной среды его длину,
  13. if (post_length) { // если она не нулевая,
  14. post_data = (char*)malloc(post_length+1); // выделяем память для буфера,
  15. fread(post_data, post_length, 1, stdin); // читаем со стандартного ввода тело запроса,
  16. post_data[post_length] = 0; // завершаем строку нулевым байтом.
  17. }
  18. }
  19. // Выводим заголовок ответа...
  20. printf("Content-type: text/html\r\n\r\n");
  21. // и его тело:
  22. printf("<h1>Здравствуйте!</h1>\r\n");
  23. if (strlen(query_string)) {
  24. printf("<p>Параметры GET-формы: %s\r\n", query_string);
  25. }
  26. if (post_length) {
  27. printf("<p>Параметры POST-формы: %s (длина тела запроса: %d)\r\n", post_data, post_length);
  28. free(post_data); // не забываем освободить выделенную в строке 17 память
  29. }
  30. return 0;
  31. }

Это простейшая CGI-программа на Си, выводящая содержимое полученных от веб-сервера параметров форм. Браузер в результате получит примерно следующий код (если "засабмитить" на эту программу POST-форму из последнего примера):

<h1>Здравствуйте!</h1>
<p>Параметры POST-формы: name=Vasya&okbutton=OK (длина тела запроса: 22)

Что при этом отобразится на экране пользователя, думаю, понятно без комментариев.:)

Как видите, даже простейшая программа вывода параметров не так-то проста. Более того, по стандарту HTTP почти все не алфавитно-цифровые символы (в т.ч. и русские буквы) передаются в так называемом UrlEncoded-виде (%XX, где XX - шестнадцатеричный код символа), и, если добавить в приведенную Си-программу код расшифровки UrlEncode, она уже не поместится на экран. А это - всего лишь базовые операции. А как вырастет программа на Си, если необходимо работать с базой данных?


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

А теперь взглянем на веб-сервер Apache. По своей природе он модульный, и позволяет подключать расширения добавлением одной строки в конфигурационный файл. (Ну, хорошо, хорошо, двух строк.:)). Было бы прекрасно, если бы существовал скриптовый язык, заточенный именно под Web, подключаемый модулем к Апачу, не так ли? Ну, вы уже поняли, к чему я клоню:) - это и есть PHP.

В принципе, PHP можно скомпилировать и как CGI-приложение, и использовать так же, как и Perl - но это для нестандартных веб-серверов или особых извращенцев.:)

II. PHP: Препроцессор Гипертекста

В 1994-м году, один программист, по имени Rasmus Lerdorf, намучавшись с классическим перловым модулем CGI, решил написать несколько собственных Perl-скриптов, дабы было попроще создавать собственную домашнюю страницу, и назвал все это дело Personal Home Page (PHP). Через некоторое время ему понадобилось обрабатывать формы, ну и для увеличения производительности все было переписано на C - так появился Personal Home Page/Forms Interpreter (PHP/FI) 2.0. Труды свои Расмус, следуя принципам Open Source, выложил на всеобщее обозрение, и, в принципе, на некоторм количестве сайтов PHP/FI вполне успешно использовался, хотя был довольно примитивен.

В 1997-м на PHP/FI - в поисках инструмента для удобного Веб-скриптинга - наткнулись два других программера - Andi Gutmans и Zeev Suraski. Сама идея им понравилась, но функциональность и скорость работы PHP/FI оставляли желать лучшего, и Andi и Zeev решились переписать PHP с нуля. Язык получился универсальный и мощный, и вскоре привлек внимание множества веб-разработчиков: к концу 1998 года PHP3 использовался на ~10% веб-серверов. Скромное название "Personal Home Page" уже не очень-то соответствовало реальности, и название было изменено на - в лучших Unix-традициях - рекурсивное: P HP: H ypertext P reprocessor.

"Движок" PHP 4, названный Zend Engine, разрабатывался усилиями уже сформировавшегося и с тех пор непрерывно расрастающегося PHP community, и в 2000-м году вышла 4-я версия PHP, ставшая менее чем через полгода стандартом для Веб-разработки под Unix (и не только): каждый уважающий себя хостер предоставлял поддержку PHP. Сейчас подходит к концу разработка PHP5, основанного на новом Zend Engine 2...

Впрочем, хватит лирики. Давайте посмотрим на простой PHP-скрипт. Сначала немного изменим HTML-форму из предыдущего раздела:


  1. <form method="POST" action="form_handler.php">
  2. Введите Ваше имя: <input type="text" name="name">
  3. <br>
  4. <input type="submit" name="okbutton" value="OK">
  5. </form>

А теперь - form_handler.php:

  1. <html>
  2. <body>
  3. <?
  4. echo "<h1>Привет, <b>". $_POST['name']. "</b></h1>!";
  5. ?>
  6. </body>
  7. </html>

В отличие от Си или Perl, php-скрипт представляет собой обычную, в общем-то, HTML-страницу: "просто так" написанные тэги передаются "как есть", будто бы это обычный html-ник. Сам скрипт заключается в специальные тэги <? и ?>, внутри которых мы используем для вывода текста оператор echo. Таких блоков может быть сколько угодно, все, что между ними, интерпретируется как обычный html.

Переменные GET-запроса попадают в массив $_GET, переменные POST-запроса - в массив $_POST, серверные переменные (типа IP-адреса, имени скрипта и т.д.) - в $_SERVER, оператор "точка" (.) - объединение строк... Причем все служебные операции (чтение stdin и переменных среды, Url-декодирование) уже произвел сам PHP. Удобно, не так ли?

Далее. Зачем нам два файла - HTML с формой и PHP-скрипт? Вполне достаточно одного скрипта:

  1. <html>
  2. <body>
  3. <?
  4. if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  5. echo "<h1>Привет, <b>". $_POST['name']. "</b></h1>!";
  6. }
  7. ?>
  8. <form method="POST">
  9. Введите Ваше имя: <input type="text" name="name">
  10. <br>
  11. <input type="submit" name="okbutton" value="OK">
  12. </form>
  13. </body>
  14. </html>

Мы убрали из тэга form атрибут action - это значит, что форма отправляется "сама на себя", т.е. на текущий URL. Это иногда называют "postback form". В строке 4 с помощью оператора if проверяется, использовался ли для загрузки документа метод POST (аналог строки 13 примера на Си), и - если это так - в следующей строке выводится приветствие.

На этой простой программе - своего рода Web-варианте "Hello World" - мы и завершим вводную главу.

амоучитель PHP: Глава 2. Установка и настройка Apache+PHP

Содержание главы

Версия для печати

  1. Установка Apache
    1. - в ОС Windows
    2. - в ОС семейства Unix
  2. Установка PHP
    1. - в ОС Windows
    2. - в ОС семейства Unix
  3. Настройка Apache+PHP
  4. Установка PHP5

Прежде, чем приступить к изучению PHP, неплохо бы его установить. И, конечно же, понадобится веб-сервер - остановимся на Apache 1.3 как на самом популярном и стабильном в связке с PHP.

Если вы решили использовать Apache 2, настоятельно рекомендуется собирать его с prefork MPM - см. документацию.
Также (это касается пользователей Windows) не стоит соблазняться удобством установки готовых комплектов, типа "Денвер-2": все, конечно, "заработает само", но при необходимости изменить файлы конфигурации - а это вам обязательно понадобится - отсутствие опыта самостоятельной установки вам совсем не поможет. Как вариант - можете установить Apache+PHP вручную, разобраться, как все настраивать, ну а потом деинсталлировать плоды своих трудов и установить тот же "Денвер", если он вам так нравится.:)


Мы рассмотрим установку Apache+PHP в ОС Windows (рассматривая только "настоящие" ОС - NT/2000/XP/2003) и Unix (в частности, Linux и FreeBSD).

Apache+PHP... "А как же MySQL?" - спросит продвинутый пользователь... А MySQL мы установим попозже - пока он нам не нужен.







Date: 2015-09-17; view: 636; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.009 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию