TemplateEngine.md 5.4 KB

Сессии, Куки, Формы и Шаблонизация

Сегодняшнее занятие будет посвящено взаимодействию с пользователем и браузером пользователя. Будут рассмотрены механизмы персонализации сгенерированных PHP страниц, прием данных от пользователя, верстка и шаблонизация.

Сессии и Куки

HTTP

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-файл).

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

Cookie

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

  • При создании сессии (например, при удачном логине) сервер создает уникальный ключ. Ключ должен быть достаточно большим, что бы его было крайне маловероятно подобрать.
POST /login/ HTTP/1.1
Host: example.com
Accept: text/html
 
login=user&password=eightasterisks
  • Ключ отсылается в браузер в заголовке вместе с ответом. Браузер запоминает его на определенное время для определенного URL
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

Исторически сложилось, что PHP работает так же, как и протокол HTTP - скрипт запускается по запросу, отрабатывает, отдает ответ и умирает. Соответственно, сессия, как средство сохранения контекста между обращениями к скрипту, организуется в ручном режиме.

<?php
session_start();

Код выше осуществляет "старт" сессии - генерацию ключа и отправку его вместе с заголовком для текущего ответа. Сохраните этот код в файл и запустите встроенный в php web-сервер в папке с файлом

php -S 127.0.0.1:8000

Открыв в браузере ссылку http://127.0.0.1:8000/session.start.php и взглянув через Developer Tools на заголовки, вы увидите заголовок Set-Cookie в ответе сервера. После нажатия F5, и в дальнейшем браузер будет посылать заголовок Cookie подобного вида:

Cookie:PHPSESSID=5q8sgn2j1kj0jk4j5u8rldo5p1

PHPSESSID - имя для переменной сессии по умолчанию, можно настроить в php.ini параметром session.name

$_SESSION

Суперглобальный ассоциативный массив $_SESSION является основным хранилищем данных сессии.

<?php
session_start();
if (!isset($_SESSION['counter'])){
    $_SESSION['counter'] = 0;
}
$_SESSION['counter'] ++;
echo $_SESSION['counter'];