Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка PHP 2008.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
1.28 Mб
Скачать

1.2 Передача документа пользователю

Рассмотрим, как программа посылает свой ответ (то есть документ) пользователю. Сценарий просто помещает документ в стандартный поток вывода (на Си он называется stdout), который находится под контролем программного обеспечения сервера. Программа работает так, как будто нет никакого пользователя, а нужно вывести текст прямо на «экран». (Это она так думает, на самом деле выводимая информация будет перенаправлена сервером в браузер пользователя. Ясно, что у сценария никакого «экрана» нет и быть не может). Ответ программы, как и запрос пользователя, должен состоять из заголовков. Мы не можем просто направить документ в стандартный поток вывода: сначала нужно указать, в каком формате информация должна быть передана пользователю.

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

Заголовок кода ответа. Здесь имеется одно отличие от формата, который используется в заголовках запроса. Первый заголовок ответа обязан иметь слегка специфичный вид – в нем не должно быть двоеточия. Он задает код ответа сервера и выглядит, например, так:

HTTP/1.1 OK

или так:

HTTP/1.1 404 File Not Found

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

Наиболее распространенные заголовки ответа:

  • Content-type

Формат: Content-type: mime_тип; charset=koi8-r

Задает тип документа и его кодировку. Параметр charset задает кодировку документа. Поле mime_тип определяет тип информации, которую содержит документ: text/html – HTML-документ; text/plain – простой текстовый файл; image/gif – GIF-изображение; image/jpeg – JPG-изображение.

  • Pragma

Формат: Pragma: no-cache

Запрещает кэширование документа браузером, так что при повторном визите на страницу браузер гарантированно загрузит ее снова, а не извлечет из своего кэша. Это может быть полезно, если страница содержит, например, динамический счетчик посещений.

  • Location

Формат: Location: http://www.host.com/page.html

Заголовок определяет, что браузер пользователя должен перейти по указанному адресу, не дожидаясь тела документа ответа (как будто бы пользователь сам набрал в адресной строке нужный URL).

  • Set-cookie

Формат: Set-cookie: параметры_cookie

Устанавливает Cookie в браузер пользователя.

  • Date

Формат: Date: Sat, 08 Jan 2000 11:56:26 GMT

Указывает браузеру дату отправки документа.

  • Server

Формат: Server: Apache/1.3.9 (Unix) PHP/3.0.12

Устанавливается сервером и указывает браузеру тип сервера и другую информацию о серверном программном обеспечении.

Пример CGI-сценария на Си:

#include <time.h> // Нужна для инициализации функции rand()

#include <stdio.h> // Поддержка функций ввода/вывода

#include <stdlib.h> // Поддержка функции rand()

// Главная функция. Именно она и запускается при старте сценария.

void main(void) {

// инициализируем генератор случайных чисел

int Num; time_t t; srand(time(&t));

// в Num записывается случайное число от 0 до 9

Num = rand()%10;

// далее выводим заголовки ответа. Тип — html-документ

printf("Content-type: text/html\n");

// запрет кэширования

printf("Pragma: no-cache\n");

// пустой заголовок

printf("\n");

// выводим текст документа — его мы увидим в браузере

printf("<html><body>");

printf("<h1>Здравствуйте!</h1>");

printf("Случайное число в диапазоне 0-9: %d",Num);

printf("</body></html>");

}

Исходный текст можно откомпилировать и поместить в каталог с CGI-сценариями на сервере. Обычно стараются все сценарии хранить в одном месте – в каталоге cgibin, у которого имеется разрешение на выполнение всех файлов внутри него.

Пусть нам нужен сценарий, который бы передавал пользователю какой-то GIF-рисунок. Делается это аналогично: выводим заголовок

Content-type: image/gif. Затем копируем один-в-один нужный нам GIF-файл в стандартный поток вывода (лучше всего – функцией fwrite).

CGI-сценарии могут использоваться не только для вывода HTML-информации, но и для любого другого ее типа – начиная с графики и заканчивая звуковыми MIDI-файлами. Тип документа задается в единственном месте – заголовке Content-type.