::: PHP.com.ua - учимся вместе. ::: ::: PHP.com.ua - учимся вместе. :::



 
   - Вакансия PHP-программист, Днепропетровск...
  - Проблема с передачей переменной в PHP ск...
  - Как хранить конфигурацию cms'ки?
  - Проблема с сортировкой массива
  - коллизии md5
  - Странный глюк функции date
  - Скроллинг в iframe


Главная
Новости
Статьи
Шпаргалки
Файлы
О проекте
Форум
Футболки


FREEhost.com.ua - купил хостинг 10 у.е. на Begun в подарок.

iName.com.ua - регистрация доменных имен и хороший хостинг.

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

Designclub - Клуб дизайнеров Украины.

Регистрация доменов
Хостинг

 HowtoForge.ORG.UA - Это первый Украинский ресурс развития open source программного обеспечения


Путь: Статьи > Новичкам

Новичкам

Автор: - Yurik
Дата публикации - 21.5.2005
Просмотров: - 4111

Основы: CGI - общий принцип работы веб-приложений


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


CGI - это спецификация которая определяет как приложение будет получать и отправлять информацию через посредство веб-сервера.


CGI работает как с компилируемыми програмами так и с интерпретируемыми (сценариями).
[p]Как работает CGI[/p]
Для того чтобы приложение могло быть встроено в веб-узел, необходимо выполнить два общих условия. Во-первых, приложение должно получать данные от веб-броузера и веб-сервера, во вторых - возвращать результат выполнения броузеру.


Понимание CGI невозможно без знания основ HTTP. HTTP соединение представляет собой канал связи между веб-сервером и броузером. Большинство соединений HTTP инициируются клиентом, когда броузер посылает запрос на получение документа. В начале запроса располагается раздел, называемый заголовком. Вот некоторые наиболее частые заголовки












GET | POSTОсновной заголовок, он указывает метода запроса (основных их два - GET или POST) и документ который нужно возвратить (возможно с параметрами), а также версию HTTP, например GET /info.php HTTP/1.1
AcceptУказывает какие MIME типы документов понимает броузер
Accept-EncodingУказывает какие типы кодировки понимает клиент, например gzip, deflate
Accept-LanguageИспользуется для content-negotiation. Указывает предпочтения пользователя к языкам содержимого, например: uk,en-us;q=0.5
ConnectionТип подключения, наиболее часто close или Keep-Alive
CookieСодержимое кук
HostКакому хосту (домену) адресован запрос
User-AgentИдентификация броузера, например Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; BCD2000)
AuthorizationИнформация о http-аутентификации
PragmaСпециальные инструкции для прокси-серверов, позволяющие или запрещающие кеширование документов и/или заголовков
RefererСодержит URL предыдущего документа включающего ссылку с помощью которой пользователь пришел на текущий документ

После получения HTTP-запроса сервер обрабатывает его, выдавая требуемый документ, если таковой существует, и закрывает соединение HTTP. Непосредственно перед документом сервер посылает броузеру заголовок ответа HTTP. В заголовке содержится информация о документе. Вот некоторые поля:








]http://www.pupkin.com/cgi-bin/otherdoc'/url]

Keep-Alive timeout=15, max=99
ConnectionKeep-Alive
Transfer-Encodingchunked
Date
Last-modified
Server
Content-TypeПоследний заголовок (после него идет непосредственно документ, поэтому он всегда последний), указывает MIME-тип возвращаемого докмента, наиболее часто он имеет вид: text/html; charset=windows-1251
LocationПеренаправление броузера на другой URL, например 'Location: url=http://www.pupkin.com/cgi-bin/otherdoc'
StatusСодержит коды статуса HTTP

Вот коды статуса HTTP (обычно возвращаются когда по какой-либо причине документ не может быть отправлен)
[code]Status-Code = "100" ; Continue
| "101" ; Switching Protocols
| "200" ; OK
| "201" ; Created
| "202" ; Accepted
| "203" ; Non-Authoritative Information
| "204" ; No Content
| "205" ; Reset Content
| "206" ; Partial Content
| "300" ; Multiple Choices
| "301" ; Moved Permanently
| "302" ; Moved Temporarily
| "303" ; See Other
| "304" ; Not Modified
| "305" ; Use Proxy
| "400" ; Bad Request
| "401" ; Unauthorized
| "402" ; Payment Required
| "403" ; Forbidden
| "404" ; Not Found
| "405" ; Method Not Allowed
| "406" ; Not Acceptable
| "407" ; Proxy Authentication Required
| "408" ; Request Time-out
| "409" ; Conflict
| "410" ; Gone
| "411" ; Length Required
| "412" ; Precondition Failed
| "413" ; Request Entity Too Large
| "414" ; Request-URI Too Large
| "415" ; Unsupported Media Type
| "500" ; Internal Server Error
| "501" ; Not Implemented
| "502" ; Bad Gateway
| "503" ; Service Unavailable
| "504" ; Gateway Time-out
| "505" ; HTTP Version not supported[/code]
Когда вместо статического документа заголовок запроса указывает на CGI приложение, веб-сервер запускает его и помещает в переменные окружения основную часть заголовокв запроса. Эту информацию приложение поучает по стандартному каналу ввода (В Perl например так read(STDIN, $string, $ENV{'CONTENT_LENGTH'}) или $string=$ENV{'QUERY_STRING'}).

Когда приложение отработало, вся информация через стандартный вывод (STDOUT) передается назад на анализ серверу. Он разбирает этот ответ на заголовки и собственно документ.

Приложение может возвращать два вида заголовков:

  • Частичные (parsed)
  • Полные (non-parsed)

При получении частичного заголовка сервер анализирует его и, в соответствии со своей конфигурацией, добавляет недостающие заголовки. Полные заголовки не требуют никаких действий и отправляются как есть.


Основной заголовок который должно возвратить приложение - Content-type. Его достаточно серверу чтобы отправить документ.
[p]Пример приложения CGI[/p]
[code]#!/usr/local/bin/perl

print "Content-type: text/text\n\n";
print "Hello World";
[/code]
Это приложение сначала возвращает заголовок (после заголовков всегда следует пустая строка - \n\n). Все что выводится после заголовка Content-type считается содержиммым.
[code]#!/usr/local/bin/perl

print "Content-type: text/text\n\n";
print "Location: url=http://www.pupkin.com/cgi-bin/user.pl\n\n";]http://www.pupkin.com/cgi-bin/user.pl\n\n";/url]
print "Hello World";
[/code]
В этом примере второй заголовок Location: не сработает а просто выведется в броузе ркак текст, потомму что он стоит после заголовка Content-type
[p]Особенности PHP как CGI[/p]
Всё вышесказанное касается и PHP, независимо от того, установлен он как CGI или как модуль Apache/IIS, только PHP, как язык более высокого уровня, имеет ряд отличий:

  • Вывод заголовков ответа и собственно содержимого производится не на стандартный вывод, а через соответствующие функции: print(); директиву echo; и заголовки через функцию header();.
  • Любой вывод через print или echo автоматически посылает перед ним заголовок Content-type: XXXXXX, где XXXXXX выставляется в конфигурации:
    [quote]<b>php.ini</b><br>
    default_mimetype="text/html"<br>
    default_charset="windows-1251"
    [/quote]
  • Посылать заголовки можно даже после вывода содержимого, если включен буфер вывода. В конце работы PHP автоматически расставит всё на свои места, даже если вы напутали порядок вывода.
  • PHP автоматически преобразует заголовки запроса в удобные переменные. Сравните для примера код получения переменной в PHP и Perl (или C):
    [code]<?php
    echo $_GET['var'];
    // и сравните тот же код в Perl
    ?>
    #!usr/local/bin/perl

    $user_string=$ENV{'QUERY_STRING'};
    $user_string=~ s/\+/ /g;
    @name_value_pairs=split(/&/,$user_string);
    foreach $name_value_pair (@name_value_pairs){
    ($name, $value)=split(/=/, $name_value_pair);
    $name=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ge;
    $value=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ge;
    if (defined($_GET{$name})){
    $_GET{$name}.=":".$value;
    } else {
    $_GET{$name}=$value;
    }
    }
    print "Content-type: text/text\n\n";
    print $_GET{'var'};
    [/code]

[p]Другие переменные окружения[/p]
Как было сказано, веб-сервер помещает в переменные окружения данные из заголовка запроса. Но кроме этих данных, туда попадают также другая служебная информация. Вот основные переменные окуржения CGI:






















AUTH_TYPEМетод аутентификации используемый веб-броузером
CONTENT_LENGTHДлина в символах данных запроса передаваемых на стандартный ввод
CONTENT_TYPEТип MIME информации пользователя
DOCUMENT_ROOTКорневой каталог дерева документов сервера
GATEWAY_INTERFACEВерсия CGI. CGI/1.1
HTTP_ACCEPTHTTP_ + одноименный заголовок запроса
HTTP_REFERERHTTP_ + одноименный заголовок запроса
HTTP_USER_AGENTHTTP_ + одноименный заголовок запроса
PATH_INFOДополнительная информация о пути
PATH_TRANSLATEDФизический путь на серверной машине, полученный веб-сервером из запрошенного виртуального пути
QUERY_STRING
REMOTE_ADDR
REMOTE_HOST
REMOTE_IDENT
REMOTE_USER
REQUEST_METHOD
SCRIPT_NAME
SERVER_NAME
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE




Обсудить в ФОРУМе - комментариев ()


Путь: Статьи > Новичкам

Если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Контакты Design by webFaction Ukrainian PHP Group 2004-2005