Сегодняшнее занятие будет посвящено взаимодействию с пользователем и браузером пользователя. Будут рассмотрены механизмы персонализации сгенерированных PHP страниц, прием данных от пользователя, верстка и шаблонизация.
HTTP - протокол, изначально предназначенный для работы в режиме запрос -> ответ, после чего соединение закрывается (вспомним о том, что изначально HTTP - просто средство выдачи страниц для чтения, не более того).
Например
Запрос:
GET / HTTP/1.1
Host: example.com
Accept: text/html
<пустая строка>
Ответ:
HTTP/1.1 200 OK
Content-Length: 1983
Content-Type: text/html; charset=utf-8
<html>
<head>...</head>
<body>...</body>
</html>
Таким образом, запрос и ответ состоят из стартовой строки(GET), заголовков (Content-Length), и собственно контента, ради которого весь этот обмен данных был сделан (html-файл).
По окончанию обмена данными соединение разрывается, и следующее обращение к серверу происходит с чистого листа.
Под сессией подразумевается определенный контекст, в котором происходит обмен данными между клиентом (браузером) и сервером. В этом контексте хранится определенная информация, касающаяся только конкретного клиента (например залогиненного пользователя: логин, пароль, личная переписка и другая персональная информация). Как это работает:
POST /login/ HTTP/1.1
Host: example.com
Accept: text/html
login=user&password=eightasterisks
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Set-Cookie: key=LongAndWeirdRandomSecureCharset
<html>
<head>...</head>
<body>...</body>
</html>
Обратите внимание на заголовок **Set-Cookie**. Именно он в себе хранит уникальный ключ, который будет запомнен браузером
GET / HTTP/1.1
Host: example.com
Accept: text/html
Cookie: key=LongAndWeirdRandomSecureCharset
Исторически сложилось, что PHP работает так же, как и протокол HTTP - скрипт запускается по запросу, отрабатывает, отдает ответ и умирает. Соответственно, сессия, как средство сохранения контекста между обращениями к скрипту, организуется в ручном режиме.
<?php
session_start();
Код выше осуществляет "старт" сессии - генерацию ключа и отправку его вместе с заголовком для текущего ответа