Доступ к базе данных на стороне сервера
Механизм реализуется за счет наличия двух более или менее стандартизованных средств: возможности включения форм в документ, составленный с использованием языка гипермедийной разметки HTML, и возможности использования внешних по отношению к серверу Web программ, взаимодействие которых происходит через специфицированный протокол CGI (Common Gateway Interface) или внедренный позже API (Application Program Interface). (Хотя CGI называется "общим интерфейсом шлюзования", по сути дела, это одновременно некоторое подмножество протокола HTTP, и способ его соблюдения при взаимодействии сервера с внешней программой.)
При реализации на основе CGI общая схема реализации доступа к базе данных на стороне Web-сервера выглядит следующим образом:
- при просмотре документа клиент встречает ссылку на страницу, содержащую одну или несколько форм, предназначенных для запроса данных из базы данных;
- клиент запрашивает эту страницу; помимо незаполненных форм страница может содержать общую информацию о базе данных и о назначении предлагаемых форм;
- если клиента действительно интересует информация из базы данных, которую можно получить на основе предложенных форм, то он заполняет одну из форм и отправляет заполненную форму на сервер;
- получив заполненную форму, сервер запускает соответствующую внешнюю программу, передавая ей параметры и получая результаты на основе протокола CGI;
- внешняя программа преобразует запрос, выраженный с помощью заполненной формы, в запрос на языке, понятном серверу баз данных (обычно это язык SQL).
Замечание: говоря формально, внешняя программа осуществляет компиляцию языка форм в базовый язык сервера баз данных; это может быть очень простая компиляция с использованием заготовок SQL-операторов, но тем не менее компиляция. Между прочим, многие люди недооценивают сложность этой проблемы. Компилятор - он и в Африке компилятор. Язык форм ничем не проще любого другого языка. Толмач - это наиболее ценный элемент нашего разрозненного общества. Как мне смешно, когда некоторые мои знакомые считают, что перевести запрос, заданный на языке форм, в представление на языке SQL проще, чем откомпилировать программу на языке Фортран в машинные коды;
- внешняя программа взаимодействует с сервером баз данных; взаимодействие может быть прямым, если внешняя программа жестко привязана к конкретному SQL-серверу, или с использованием, например, протокола и соответствующего драйвера ODBC, если жесткая привязка отсутствует;
- после получения результатов запроса внешняя программа формирует соответствующую виртуальную или реальную HTML-страницу, передает ее серверу и завершает свое выполнение;
- сервер передает сформированную HTML-страницу клиенту, и на этом процедура доступа к базе данных завершается (как обычно, сервер разрывает транспортное соединение с клиентом).
На сленге Web-мастеров любая внешняя программа, запускаемая Web-серверомв соответствии со спецификациями CGI, называется CGI-скриптом. CGI-скриптможет быть написан на языке программирования (Си, Си++, Паскаль и т. д.)или на командном языке (языки семейства shell, perl и т. д.). CGI-скрипт,выполняющий роль посредника между Web-сервером и другими видами серверов(например сервером баз данных), называется шлюзом (видимо, более правильно было бы использовать термин CGI-шлюз). Наличие CGI-скриптов на стороне Web-сервера позволяет, в частности, перенести часть логики приложения из клиента в сервер. CGI-шлюзы представляют собой средство для организации трехзвенной (в общем случае, многозвенной) архитектуры клиент-сервер.
В спецификациях CGI предусмотрены четыре способа взаимодействия Web-сервераи CGI-скрипта (по крайней мере в среде ОС Unix). Первый способ состоит в использовании создаваемых сервером переменных окружения, через которые передается как общая информация, независящая от функциональных особенностей CGI-скрипта (например имя и версия Web-сервера), так и специфические данные, определяющие поведение CGI-скрипта (скажем набор значений, введенных в форму на стороне клиента). Второй способ заключается в формировании параметров argc и argv, которые передаются функции main CGI-скрипта (как если бы CGI-скриптвызывался командной строкой в интерактивном режиме). Этот способ применяется для реализации ограниченного класса запросов ISINDEX. Наконец, входные параметры могут передаваться CGI-скрипту через файл стандартного ввода, а CGI-скрипт может передавать Web-серверу результирующие данные через файл стандартного вывода.
Как видно, при использовании CGI вся интерпретация пользовательского запроса производится CGI-скриптом. Скрипт может быть предельно жестким, ориентированным на выполнение запроса к фиксированной таблице фиксированной базы данных, или относительно гибким, способным выполнить произвольный запрос к одной или нескольким таблицам базы данных, идентифицируемой в параметрах клиента.
Что касается API, то для людей, знающих одновременно Unix и операционные системы вообще, ситуация предельно ясна. Запуск независимого "тяжеловесного" процесса стоит немало. Загрузка и выполнение еще одной программы в уже существующем адресном пространстве по сравнению с предыдущем вариантом гораздо дешевле. Нет никаких новых идей. API - это, фактически, дешевый способ (хотя и небезопасный: понятно, почему?) выполнить в адресном пространстве сервера WWW программу, которая соответствует спецификациям на языке HTML(объясняю, почему; никто не захочет впустить в свою квартиру на предмет хотя бы временного жительства незнакомого человека; внешние программы незнакомы серверу). Такая программа должна быть заранее подготовлена и включена в библиотеку, из которой сервер может производить динамическую загрузку (например, такая библиотека может быть разделяемой - shared library). Т. е. смысл не меняется, меняется только реализация.