Разберём заголовок. Он начинается с названия протокола "HTTP/1.1", после чего идёт пробел, затем - код возврата "200 OK". После кода возврата идёт символ переноса строки.
Коды ответов сервера
Вот основные коды возврата, определённые для серверов:
Коды с номером типа 1xx: информационный - запрос послан, идёт процесс:
· "101 Switching Protocols" - переключение протокола
Коды с номером типа 2xx: удачное завершение - запрос полностью послан, прочитан/понят сервером и принят им:
· "200 OK" - запрос успешно получен, понят, принят и выполнен
· "201 Created" - создано
· "202 Accepted" - принято
· "203 Non-Authoritative Information" - нерабочая информация
· "204 No Content" - нет информации к ответу
· "205 Reset Content" - очистка ответа
· "206 Partial Content" - выдаётся запрошенная часть документа (см. "Range-Unit" в запросе клиента)
Коды с номером типа 3xx: перенаправление - действие нуждается в уточнении либо просто информационный ответ:
· "300 Multiple Choices" - множественный выбор - по данному запросу обнаружено несколько вариантов документов
· "301 Moved Permanently" - документ переехал
· "302 Found" - найдено
· "303 See Other" - смотри остальные
· "304 Not Modified" - не изменён
· "305 Use Proxy" - используй прокси
· "307 Section" - временное перемещение запроса
Коды с номером типа 4xx: ошибка клиента - запрос клиента имеет либо неправильный синтаксис, либо не понят:
· "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" - в "Accept" не указан поддерживаемый сервером формат данных
· "416 Requested range not satisfiable" - требуемый кусок (с помощью "Range-Unit") имеет неверные размеры
· "417 Expectation Failed" - неожиданная ошибка при разборе запроса (может возникнуть при пересылке типа "multipart/form-data" при неправильном делителе)
Коды с номером типа 5xx: ошибка сервера - сервер не может обработать запрос клиента
· "500 Internal Server Error" - внутренняя ошибка сервера
· "501 Not Implemented" - не применяется (этот запрос не применим)
· "502 Bad Gateway" - "плохие врата" - сервер не обрабатывает запросы с этого сегмента IP
· "503 Service Unavailable" - такой сервис недоступен (к примеру TRACE запрос)
· "504 Gateway Time-out" - слишком долго сервер пытался получить данные, связь плохая
· "505 HTTP Version not supported" - версия HTTP, указанная в запросе, не поддерживается данным сервером
Параметры HTTP ответа
Продолжим разбор параметров заголовка в ответе сервера. Прежде всего упомяну, что параметры "Cache-Control", "Pragma" и "Proxy-Connection" идентичны как для запроса, так и для ответа, по этому всё сказанное про них выше, применимо и тут.
Set-Cookie: name=value; expires=date; path=PATH; domain=HOSTNAME; secure
Не буду подробно останавливаться на этом параметре. Он устанавливает или удаляет cookie и подробно о нём написано вCookie Specification.
Location: http://www.devresource.org
Данный параметр указывает браузеру, что нужно открыть ресурс http://www.devresource.org вместо текущего. В значении этого параметра указывается URI ресурса для перехода.
Date: Mon, 07 Apr 2003 14:51:19 GMT
Параметр показывает дату документа. Это либо текущая дата (если документ динамический), либо дата создания отправляемого файла. Дата представлена в формате GMT.
Last-Modified: Mon, 07 Apr 2003 14:51:00 GMT
Параметр показывает дату последнего изменения документа.
Server: Apache/1.3.20 (Win32) PHP/4.3.0
Параметр содержит имя сервера.
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Эти два параметра сообщают, что поддерживается постоянное соединение с сервером (вы противном случае было бы "Connection: close"), что текущее время timeout для сокета сервера составляет 15 секунд и что клиент может изменить это время максимум до 100 секунд.
Accept-Ranges: bytes
Этот параметр существует, чтобы указать клиенту, какая часть документа ему пересылается (в случае присутствия "Range-Unit" в запросе) Параметр этот может содержать значение "bytes", означающее, что пересылается файл целиком.
Так же "none" (или этот параметр может быть просто опущен), означающее, что докачка не используется или не поддерживается, а строка "Accept-Ranges: 1:637" будет означать, что пересылается кусок документа с байта под номером 1 и длиной в 637 байт.
Content-Length: 673
Длина пересылаемого документа.
Content-Type: application/zip
MIME тип пересылаемого документа
Content-Disposition: attachment; filename=test.zip
указывает, что пересылаемый файл имеет название "test.zip"
Accept-Charset: windows-1251
указывает кодировку текста документа (в данном случае - русскую кодировку windows)
Accept-Encoding: compress, gzip
этот параметр используется сервером, чтобы указать клиенту, что документ ему передаётся в сжатом виде (и для сжатия используется стандарт gzip)
Accept-Language: ru
Параметр указывает на язык, использованный сервером для документа. IE6, получивший такой заголовок, к примеру, может переключить раскладку клавиатуры на русскую для текстовых элементов в полученном документе.
Transfer-Encoding: chunked
Данный параметр показывает метод выдачи данных сервером. В данном случае сервер будет выдавать данные по кусочкам, а не всё сразу.
На этом краткое описание HTTP протокола можно считать завершённым.
Задания к работе
1. Чем отличаются методы GET и POST?
2. Создание тестовой системы и счетчика посещений страницы средствами CGI, PHP и СУБД MySQL
3. CGI. Проверка знания таблицы умножения и текстовый счетчик посещения страницы.
4. PHP. Проверка знания таблицы умножения с записью результатов прохождения теста разными пользователями в базу данных.
5. CGI. Любой психологический тест и текстовый счетчик посещения страницы.
6. PHP. Любой психологический тест и вывод результатов в базу данных.
7. CGI. Проверка знания языка HTML и текстовый счетчик посещения страницы.
8. PHP. Проверка знания языка HTML с тематическими вопросами и вывод результатов с процентами успешных ответов по каждой теме в базу данных.
9. CGI. Экзамен по дисциплине и текстовый счетчик посещения страницы.
10. PHP. Экзамен по дисциплине и в результате вывод не только оценки, но и перечня тем с большинством неправильных ответов. Вывод результата по темам в базу данных.
11. CGI. Проверка знания словарного запаса (англ. или нем. или франц.) и текстовый счетчик посещения страницы
12. PHP. Проверка знания словарного запаса (англ. или нем. или франц.) с записью результатов прохождения теста разными пользователями в файл и вывода результатов в базу данных.
Практическое занятие №12
Тема: Суперглобальные массивы
Цель работы: освоение методов работы с ассоциативными массивами средствами языка PHP.
Указание к работе: понять где и когда применяются суперглобальные массивы и понять смысл их применения.
Суперглобальные переменные PHP будут описаны в дальнейшем. Массивы имеют много применений в PHP и программировании в целом.
Этот раздел представил некоторые базовые вопросы массивов PHP и описал некоторые базовые функции: это понадобится при рассмотрении более развитых свойств массивов в следующих разделах.
Константы, как и переменные, являются временным хранилищем значений в памяти.
В отличие от переменных значение константыникогда не изменяется. При объявлении константы используется функция define(), которая требует задать имя константы и значениеэтой константы.
Константам можно присваивать следующие типы данных.
Целые - целые числа или числа без десятичной точки (1, 999, 325812841).
Числа с плавающей точкой -- числа, содержащие десятичную точку (1.11, 2.5, .44).
Строки - текстовая или числовая информация.
Строковые данные всегда заключаются в кавычки ("Hello World", "478-477-5555").
Имена констант PHP в отличие от переменных не начинаются со знака "$". Имена констант обычно записывают в верхнем регистре.
Имена констант могут содержать буквы, цифры и символ подчеркивания ( _ ); они не могут, однако, начинаться с цифры.
Объявление констант показано ниже.
define("STRING_CONSTANT", "This is my string.");
define("NUMERIC_CONSTANT", 5);
В PHP версии 4 и выше введено понятие "суперглобальных" массивов. Эти массивы содержат всю информацию о состоянии сервера и среды выполнения скрипта.
Массивы доступны в любом месте скрипта без дополнительных объявлений, т.е. не надо использовать ключевое слово global.
Виды суперглобальных массивов
Всего массивов девять. Имена всех массивов записываются заглавными буквами, а начинается имя всегда с "$_" (кроме массива $GLOBALS).
|
$GLOBALS |
Массив содержит ссылки на все переменные, объявленные в данном скрипте. Это ассоциативный массив, в котором имена переменных являются ключами. |
|
|
$_SERVER |
Массив содержит все данные о настройках среды выполнения скрипта и параметры сервера. |
|
|
$_GET |
Список переменных, переданных скрипту методом GET, т.е. через параметры URL-запроса. |
|
|
$_POST |
Список переменных, переданных скрипту методом POST. |
|
|
$_COOKIE |
Массив содержит все cookies, которые сервер установил на стороне пользователя. |
|
|
$_FILES |
Содержит список файлов, загруженных на сервер из формы. Более детально мы рассмотрим этот массив в уроке, посвящённом загрузке файлов на сервер. |
|
|
$_ENV |
Содержит переменные окружения, установленные для всех скриптов на сервере. |
|
|
$_REQUEST |
Этот массив объединяет массивы $GET, $POST и $COOKIE. очень часто бывает удобен при обработке пользовательских запросов, но применять его для защищённой обработки данных не стоит. |
|
|
$_SESSION |
Массив содержит все переменные сессии текущего пользователя. |
Просмотреть содержимое всех масивов можно в результате вызова функции phpinfo().
Рассмотрим примеры использования глобальных массивов.
$_SERVER
С помощью этого массива можно узнать практически всё о сервере, на котором исполняется скрипт.
Например:
<?php
echo 'параметры сервера:' . "<br />\n";
echo "Операционная система: " .
$_SERVER["OS"] . "<br />\n";
echo "Web-сервер: " .
$_SERVER["SERVER_SOFTWARE"] . "<br />\n";
echo "Имя сервера: " .
$_SERVER["SERVER_NAME"] . "<br />\n";
echo "Адрес сервера: " .
$_SERVER["SERVER_ADDR"] . "<br />\n";
echo "Порт сервера: " .
$_SERVER["SERVER_PORT"] . "<br />\n";
echo "Адрес клиента: " .
$_SERVER["REMOTE_ADDR"] . "<br />\n";
echo "Путь к документам на сервере: " .
$_SERVER["DOCUMENT_ROOT"] . "<br />\n";
echo "Полный путь к текущему скрипту: " .
$_SERVER["SCRIPT_FILENAME"] . "<br />\n";
echo "Имя текущего скрипта: " .
$_SERVER["PHP_SELF"] . "<br />\n";?>
Пользоваться этим массивом нужно аккуратно, т.к. некоторые сервера имеют достаточно специфичные настройки или значения параметров. Иногда это приводит к неприятным ошибкам, которые к тому же очень сложно диагностировать и исправить.
Например, параметры $_SERVER["REQUEST_URI"] и $_SERVER["SCRIPT_NAME"] могут быть не установлены (хотя один из них как правило присутствует).
$_GET и $_POST
В эти массивы помещаются данные, передаваемые скрипту извне (так называемый, пользовательский ввод). В принципе, пользователь может влиять только на эти два массива плюс массив файлов и cookie. И именно поэтому все элементы этих массивов должны тщательно проверяться на допустимые значения.
Например, если пользователь ввёл в строку адреса браузера адрес "http://localhost/index.php?name=Dmitry&fam=Medvedev&jt=president&country=Russia", то массив $_GET надо будет обрабатывать так:
<?php
/*
Предполагаем, что массив $_GET должен
содержать следующие элемены
$_GET['name'] = "Dmitry";
$_GET['fam'] = "Medvedev";
$_GET['jt'] = "president";
$_GET['country'] = "Russia";
*/
// Теперь проверим наличие данных,
// а для недостающих - возьмём пустую строку
$name = (isset($_GET['name']))?
$_GET['name']:' не указано ';
$fam = (isset($_GET['fam']))?
$_GET['fam']:' не указано ';
$jt = (isset($_GET['jt']))?
$_GET['jt']:' не указано ';
$country = (isset($_GET['country']))?
$_GET['country']:' не указано ';
echo "Страна: $country <br />\n";
echo "Фамилия: $fam <br />\n";
echo "Имя: $name <br />\n";
echo "Должность: $jt <br />\n";
?>
Этот скрипт будет устойчиво работать при любом GET-запросе, даже если не будет указан ни один параметр. Если используется метод POST, то достаточно заменить $_GET на $_POST.
А если вам совершенно не важно, откуда получены данные - воспользуйтесь массивом $_REQUEST (см. ниже).