- •Тема 1 Основы cgi-программирования
- •1.1 Методы передачи данных
- •1.2 Передача документа пользователю
- •1.3 Передача информации cgi-сценарию
- •Тема 2 Характеристика языка php
- •2.1 Принцип работы php
- •2.2 Переменные, константы, выражения
- •Тема 3 Работа с данными формы
- •3.1 Передача данных
- •3.2 Трансляция полей формы в переменные
- •Тема 4 Конструкции языка
- •4.1 Условные инструкции
- •4.2 Инструкции циклов
- •4.3 Инструкции включения
- •Тема 5 Ассоциативные массивы
- •5.1 Списки и ассоциативные массивы
- •5.2 Операции над массивами
- •5.3 Списки и строки
- •5.4 Сериализация
- •Тема 6 Работа с массивами
- •6.1 Сортировка массивов
- •6.2 Функции для работы с массивами
- •Тема 7 Функции и области видимости
- •7.1 Формат определения функции, передача параметров
- •7.2 Глобальные, локальные, статические переменные
- •7.3 Рекурсия, вложенные и условно-определяемые функции
- •7.4 Передача функций по ссылке и возврат функцией ссылки
- •Тема 8 Строковые функции
- •8.1 Функции работы со строками
- •8.2 Работа с блоками текста
- •Тема 9 Математические функции
- •9.1 Встроенные константы
- •9.2 Встроенные функции
- •Тема 10 Работа с файлами и каталогами,
- •10.1 Функции работы с файлами
- •10.2 Блокирование файла
- •10.3 Функции работы с каталогами
- •10.4 Запуск внешних программ
- •Тема 11 Работа с датами и временем,
- •11.1 Представление времени в формате timestamp
- •11.2 Работа с датами, григорианский календарь
- •11.3 Посылка писем через php
- •Тема 12 Работа с www
- •12.1 Установка заголовков ответа
- •12.2 Работа с Cookies
- •Тема 13 Управление интерпретатором
- •13.1 Управление интерпретатором
- •13.2 Управление сессиями
- •Тема 14 Работа с базой данных mysql
- •14.1 Соединение с базой данных
- •14.2 Выполнение запросов к базе данных
- •Тема 15 Загрузка файлов на сервер
- •15.1 Multipart-формы, тег выбора файла
- •15.2 Поддержка закачки в php
- •Учебное издание
- •Разработка программного обеспечения на платформе net: php.Net
- •246019 Г. Гомель, ул. Советская, 104
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.
