РНР 5 в подлиннике

Страница 40 из 554


82

Часть I. Основы Web-программирования

Вывод бинарного файла

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

Content-type: image/gif

Затем копируем один в один нужный нам GIF-файл в стандартный поток вывода (лучше всего — функцией fwrite, т. к. иначе могут возникнуть проблемы с "бинар-ностью" gif-рисунка). Теперь можно использовать этот сценарий даже в таком контексте:

... какой-то текст страницы ...

<img src=http://www.myhost.com/cgi-bin/script.cgi> ... продолжение страницы ...

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

Еще раз обращаем ваше внимание на такой момент: CGI-сценарии могут использоваться не только для вывода HTML-информации, но и для любого другого ее типа — начиная с графики и заканчивая звуковыми MIDI-файлами. Тип документа задается в единственном месте — заголовке content-type. Не забывайте добавлять этот заголовок, в противном случае пользователю будет отображена стандартная страница сервера с сообщением о 500-й ошибке (для сервера Apache), из которой он вряд ли что поймет.

Исходный код скрипта, отображающего GIF-файл, мы здесь не приводим из-за обилия в нем излишних технических деталей. Вы можете найти его в архиве с исходными кодами изданной книги, доступном в Интернете. Файл называется c/gif.c.

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

Переменные окружения

Непосредственно перед запуском сценария сервер передает ему некие переменные окружения с информацией. В определенных переменных содержатся некоторые за-

Передача информации CGI-сценарию

Гпава 3. CGI изнутри

83

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

□ нттр_ассерт

В этой переменной перечислены все (во всяком случае, так говорится в документации) MIME-типы данных, которые могут быть восприняты браузером. Как мы уже замечали, современные браузеры частенько ленятся и передают строку */*, что означает, что они якобы понимают любой тип.

□ http_REFERER

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

□ http_user_agent

Идентифицирует браузер пользователя. Как правило, если в данной переменной окружения присутствует подстрока msie, то это — Internet Explorer, в противном случае, если в наличии лишь слово Moziiia, — Netscape Navigator, Mozilla или другой браузер.

□ HTTP_HOST

Доменное имя Web-сервера, на котором запустился сценарий. Точнее, то, что было передано в заголовке Host протокола HTTP 1.1. Эту переменную окружения довольно удобно использовать, например, для генерации полного пути, который требуется в заголовке Location, чтобы не привязываться к конкретному серверу (вообще говоря, чем меньше сценарий задействует "зашитую" в него информацию об имени сервера, на котором он запущен, тем лучше — в идеале ее не должно быть вовсе).

Если обращение производилось к нестандартному, отличному от 80-го, порту (например, 81 или 8080), то http_host содержит также и номер порта, указанный после имени хоста и двоеточия: хост: порт.

□ server_port

Порт сервера (обычно 80), к которому обратился браузер пользователя. Также может привлекаться для генерации параметра заголовка Location.

□ remgte_addr

Эта переменная окружения задает IP-адрес (или доменное имя) узла пользователя, на котором был запущен браузер.

□ REMOTE_PORT

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

□ scri PT_NAME

Виртуальное имя выполняющегося сценария (т. е. часть URL после имени сервера, но до символа ?). Эту переменную окружения, опять же, очень удобно брать на вооружение при формировании заголовка Location при "переадресации на се-




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006