Лабораторная работа №5 - Обработка запросов с помощью PHP

Теоретический материал

Основы клиент-серверных технологий

Архитектура «клиент-сервер» применяется в большом числе сетевых технологий, используемых для доступа к различным сетевым сервисам. Обычно, когда говорят «сервер», имеют в виду сервер в архитектуре клиент-сервер, а когда говорят «клиент» – имеют в виду клиент в этой же архитектуре.

Суть архитектуры в том, чтобы разделить функции между двумя подсистемами: клиентом, который отправляет запрос на выполнение каких-либо действий, и сервером, который выполняет этот запрос. Взаимодействие между клиентом и сервером происходит посредством стандартных специальных протоколов, таких как TCP/IP и z39.50.

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

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

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

Услугами одного сервера чаще всего пользуется несколько клиентов одновременно. Поэтому каждый сервер должен иметь достаточно большую производительность и обеспечивать безопасность данных.

Логичнее всего устанавливать сервер на компьютере, входящем в какую-либо сеть, локальную или глобальную. Однако можно устанавливать сервер и на отдельно стоящий компьютер (тогда он будет являться одновременно и клиентом и сервером).

Существует множество типов серверов. Вот лишь некоторые из них.

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

· Поисковый сервер предназначен для поиска информации в Internet.

· Почтовый сервер предоставляет услуги в ответ на запросы, присланные по электронной почте.

· Сервер WWW предназначен для работы в Internet.

· Сервер баз данных выполняет обработку запросов к базам данных.

· Сервер защиты данных предназначен для обеспечения безопасности данных (содержит, например, средства для идентификации паролей).

· Сервер приложений предназначен для выполнения прикладных процессов. С одной стороны взаимодействует с клиентами, получая задания, а с другой – работает с базами данных, подбирая необходимые для обработки данные.

· Сервер удаленного доступа обеспечивает коллективный удаленный доступ к данным.

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

Обычно на компьютере- сервере работает сразу несколько программ- серверов. Одна занимается электронной почтой, другая распределением файлов, третья предоставляет web-страницы.

Сервер WWW.

Часто его называют web-сервером, http-сервером или даже просто сервером. Что представляет собой web-сервер?

  • Во-первых, это хранилище информационных ресурсов.
  • Во-вторых, эти ресурсы хранятся и предоставляются пользователям в соответствии со стандартами Internet (такими, как протокол передачи данных HTTP).
  • Работа с документами web-сервера осуществляется при помощи браузера, который отсылает серверу запросы, созданные в соответствии с протоколом HTTP. В процессе выполнения задания сервер может связываться с другими серверами.

Протокол HTTP и способы передачи данных на сервер

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

HTTP (HyperText Transfer Protocol, протокол передачи гипертекста ) – это протокол прикладного уровня, разработанный для обмена гипертекстовой информацией в Internet.

HTTP предоставляет набор методов для указания целей запроса, отправляемого серверу. Эти методы основаны на дисциплине ссылок, где для указания ресурса, к которому должен быть применен данный метод, используется универсальный идентификатор ресурсов (Universal Resource Identifier) в виде местонахождения ресурса (Universal Resource Locator, URL ) или в виде его универсального имени (Universal Resource Name, URN ).

HTTP используется для коммуникаций между различными пользовательскими программами и программами-шлюзами, предоставляющими доступ к существующим Internet-протоколам, таким как SMTP (протокол электронной почты), NNTP (протокол передачи новостей), FTP (протокол передачи файлов), Gopher и WAIS. HTTP разработан для того, чтобы позволять таким шлюзам через промежуточные программы- серверы (proxy) передавать данные без потерь.

Протокол реализует принцип запрос/ответ. Запрашивающая программа– клиент инициирует взаимодействие с отвечающей программой– сервером, и посылает запрос, содержащий:

· метод доступа;

· адрес URL;

· версию протокола;

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

Ответ сервера содержит:

· строку состояния, в которую входит версия протокола и код возврата (успех или ошибка);

· сообщение (в форме, похожей на MIME), в которое входит информация сервера, метаинформация (т.е. информация о содержании сообщения) и тело сообщения.

В протоколе не указывается, кто должен открывать и закрывать соединение между клиентом и сервером. На практике соединение, как правило, открывает клиент, а сервер после отправки ответа инициирует его разрыв.

Форма запроса клиента

Клиент отсылает серверу запрос в одной из двух форм: в полной или сокращенной.

Простой запрос содержит метод доступа и адрес ресурса. Формально это можно записать так:

<Простой-Запрос> := <Метод> <символ пробел>

<Запрашиваемый-URL> <символ новой строки>

Пример простого запроса:

GET http://phpbook.info/

Здесь GET – это метод доступа, т.е. метод, который должен быть применен к запрашиваемому ресурсу, аhttp://phpbook.info/ – это URL -адрес запрашиваемого ресурса.

Полный запрос содержит строку состояния, несколько заголовков (заголовок запроса, общий заголовок или заголовок содержания) и, возможно, тело запроса. Формально общий вид полного запроса можно записать так:

<Полный запрос> := <Строка Состояния>

(<Общий заголовок>|<Заголовок запроса>|

<Заголовок содержания>)

<символ новой строки>

[<содержание запроса>]

Квадратные скобки здесь обозначают необязательные элементы заголовка, через вертикальную черту перечислены альтернативные варианты. Элемент <Строка состояния> содержит метод запроса и URL ресурса (как и простой запрос ) и, кроме того, используемую версию протокола HTTP. Например, для вызова внешней программы можно задействовать следующую строку состояния:

POST http://phpbook.info/cgi-bin/test HTTP/1.0

В данном случае используется метод POST и протокол HTTP версии 1.0.

В обеих формах запроса важное место занимает URL запрашиваемого ресурса. Чаще всего URL используется в виде URL -адреса ресурса. При обращении к серверу можно применять как полную форму URL, так и упрощенную.

Полная форма содержит тип протокола доступа, адрес сервера ресурса и адрес ресурса на сервере.

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

Методы

Любой запрос клиента к серверу должен начинаться с указания метода. Метод сообщает о цели запроса клиента. Протокол HTTP поддерживает достаточно много методов, но прежде всего используются два: GET и POST.

  • Метод GET позволяет получить любые данные, идентифицированные с помощью URL в запросе ресурса. Если URL указывает на программу, то возвращается результат работы программы, а не ее текст (если, конечно, текст не есть результат ее работы). Дополнительная информация, необходимая для обработки запроса, встраивается в сам запрос (в адресную строку). При использовании метода GET в поле тела ресурса возвращается собственно затребованная информация (текст HTML-документа, например).Примеры использования: набор адреса сайта в строке браузера или перехода по ссылке.
  • Метод POST разработан для передачи на сервер такой информации, как аннотации ресурсов, новостные и почтовые сообщения, данные для добавления в базу данных, т.е. для передачи информации большого объема и достаточно важной.

Использование HTML-форм для передачи данных на сервер

Для передачи данных на сервер используются формы. Формы предназначены для того, чтобы получать от пользователя информацию. Например, вам нужно знать логин и пароль пользователя для того, чтобы определить, на какие страницы сайта его можно допускать. Или вам необходимы личные данные пользователя, чтобы была возможность с ним связаться. Формы как раз и применяются для ввода такой информации. В них можно вводить текст или выбирать подходящие варианты из списка. Данные, записанные в форму, отправляются для обработки специальной программе (например, скрипту на PHP) на сервере. В зависимости от введенных пользователем данных эта программа может формировать различные web-страницы, отправлять запросы к базе данных, запускать различные приложения и т.п.

У тега FORM с помощью атрибутов action и method задаются имя программы, которая будет обрабатывать данные формы, и метод запроса, соответственно. Тег INPUT определяет тип и различные характеристики запрашиваемой информации. Отправка данных формы происходит после нажатия кнопки input типа submit .

Создадим форму для регистрации участников заочной школы программирования.

После обработки браузером этот файл будет выглядеть примерно так:

Использование метода GET

При отправке данных формы с помощью метода GET содержимое формы добавляется к URL после знака вопроса в виде пар имя=значения, объединенных с помощью амперсанда &:

action?name1=value1&name2=value2&name3=value3

Здесь action – это URL -адрес программы, которая должна обрабатывать форму (это либо программа, заданная в атрибуте action тега form , либо сама текущая программа, если этот атрибут опущен). Имена name1, name2, name3 соответствуют именам элементов формы, а value1, value2, value3 – значениям этих элементов. Все специальные символы, включая = и &, в именах или значениях этих параметров будут закодированы. Поэтому не стоит использовать в названиях или значениях элементов формы эти символы и символы кириллицы в идентификаторах.

Если в поле для ввода ввести какой-нибудь служебный символ, то он будет передан в его шестнадцатеричном коде, например, символ $ заменится на %24. Так же передаются и русские буквы.

Для полей ввода текста и пароля (это элементы input с атрибутом type=text и type=password ), значением будет то, что введет пользователь. Если пользователь ничего не вводит в такое поле, то в строке запроса будет присутствовать элемент name=, где name соответствует имени этого элемента формы.

Для кнопок типа checkbox и radio button значение value определяется атрибутом VALUE в том случае, когда кнопка отмечена. Не отмеченные кнопки при составлении строки запроса игнорируются целиком. Несколько кнопок типа checkbox могут иметь один атрибут NAME (и различные VALUE ), если это необходимо. Кнопки типа radio button предназначены для одного из всех предложенных вариантов и поэтому должны иметь одинаковый атрибут NAME и различные атрибуты VALUE.

В принципе создавать HTML-форму для передачи данных методом GET не обязательно. Можно просто добавить в строку URL нужные переменные и их значения.

http://phpbook.info/test.php?id=10&user=pit

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

Несмотря на все эти недостатки, использовать метод GET достаточно удобно при отладке скриптов (тогда можно видеть значения и имена передаваемых переменных) и для передачи параметров, не влияющих на безопасность.

Использование метода POST

Содержимое формы кодируется точно так же, как для метода GET, но вместо добавления строки к URL содержимое запроса посылается блоком данных как часть операции POST . Если присутствует атрибут ACTION, то значение URL, которое там находится, определяет, куда посылать этот блок данных. Этот метод, как уже отмечалось, рекомендуется для передачи больших по объему блоков данных.

Информация, введенная пользователем и отправленная серверу с помощью метода POST , подается на стандартный ввод программе, указанной в атрибуте action , или текущему скрипту, если этот атрибут опущен. Длина посылаемого файла передается в переменной окружения CONTENT_LENGTH, а тип данных – в переменной CONTENT_TYPE.

Передать данные методом POST можно только с помощью HTML-формы, поскольку данные передаются в теле запроса, а не в заголовке, как в GET . Соответственно и изменить значение параметров можно, только изменив значение, введенное в форму. При использовании POST пользователь не видит передаваемые серверу данные.

Основное преимущество POST запросов – это их большая безопасность и функциональность по сравнению с GET-запросами. Поэтому метод POST чаще используют для передачи важной информации, а также информации большого объема. Тем не менее не стоит целиком полагаться на безопасность этого механизма, поскольку данные POST запроса также можно подделать, например создав html-файл на своей машине и заполнив его нужными данными. Кроме того, не все клиенты могут применять метод POST , что ограничивает варианты его использования.

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

  • REMOTE_ADDR – IP-адрес хоста (компьютера), отправляющего запрос;
  • REMOTE_HOST – имя хоста, с которого отправлен запрос;
  • HTTP_REFERER – адрес страницы, ссылающейся на текущий скрипт;
  • REQUEST_METHOD – метод, который был использован при отправке запроса;
  • QUERY_STRING – информация, находящаяся в URL после знака вопроса;
  • SCRIPT_NAME – виртуальный путь к программе, которая должна выполняться;
  • HTTP_USER_AGENT – информация о браузере, который использует клиент

Обработка запросов с помощью PHP

Запросы клиента обрабатываются на сервере с помощью специальной программы – пользовательского скрипта (например, на языке PHP).

Внутри PHP-скрипта имеется несколько способов получения доступа к данным, переданным клиентом по протоколу HTTP.

· Суперглобальный массив $_GET- содержит данные, переданные методами GET

· Суперглобальный массив $_POST - содержит данные, переданные методами POST

· Суперглобальный массив $_REQUEST - содержит данные, переданные методами GET и POST)

Для обработки формы регистрации участников можно использовать массив $_REQUEST либо $_POST.

Обработаем созданную раннее форму, сгенерировав сообщение с приветствием участника и отображением его на экране браузера. Скрипт, который все это будет разбирать и обрабатывать, называется 1.php (форма ссылается именно на этот файл, что записано в ее атрибуте action ). По умолчанию используется для передачи метод GET , но мы указали POST . По полученным сведениям от зарегистрировавшегося человека, скрипт генерирует соответствующее сообщение. Если человек выбрал какие-то курсы, то ему выводится сообщение о времени их проведения и о лекторах, которые их читают. Если человек ничего не выбрал, то выводится сообщение о следующем собрании заочной школы программистов (ЗШП).

Единственное, что можно отметить, – это способ передачи значений элемента checkbox. Когда мы пишем в имени элемента kurs[], это значит, что первый отмеченный элемент checkbox будет записан в первый элемент массива kurs, второй отмеченный checkbox – во второй элемент массива и т.д. Можно, конечно, просто дать разные имена элементам checkbox, но это усложнит обработку данных, если курсов будет много.

Результат работы:

Задания к лабораторной работе №5

Задание №5-1

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

Задание №5-2

Создать страницу для ввода имени пользователя (login) и пароля (passwd). Если пользователь вводит правильную пару (login/passwd), то сервер выдает страницу с сообщением, что доступ к секретным страницам открыт. Login предлагается выбирать из списка.

Задание №5-3

Создайте форму генерации ссылки с параметром:

1. Создайте форму и в ней добавьте поле со списком выбора – Лаб1, Лаб2, Лаб3, Лаб4

2. При нажатии на кнопку должно быть сформирована ссылка следующего вида:

phpcourse.php?l=3 , где 3 – это номер выбранной лабораторной работы.

Задание №5-4

Написать интерфейс для генерации html-форм***:

  1. Создать форму для получения информации о том, какие элементы и сколько элементов каждого типа необходимо сгенерировать (например, текстовое поле – 3)
  2. Обработать данные скриптом, указав имена создаваемых элементов (например, текстовые поля Фамилия, Имя, Отчество)
  3. Выполнить генерацию формы (с 3 текстовыми полями – ФИО) и обработать ее другим скриптом, выводящим полученную информацию на экран (т.е. будет создана форма с 3 текстовыми полями, пользователь выполняет ввод данных и обработчик выводит эту информацию на экран.

· Генерация переключателей

· Генерация выключателей

· Генерация списка

· Задание атрибутов элементов помимо имени (например, список со множественным выбором, размер поля)

Контрольные вопросы к лабораторной работе №5

1. Что представляет собой протокол HTTP?

2. В чем отличие методов POST и GET?

3. Какие атрибуты обязательно должны быть у тега <form>?

4. Какой скрипт обрабатывает данные формы по умолчанию?

5. Что происходит при нажатии на кнопку <input type=submit>?

Наши рекомендации