От автора: В этой статье мы поговорим о сессиях в PHP. Т.к. протокол HTTP не поддерживает сохранение данных между двумя разными транзакциями, были придуманы сессии.
Это очень упрощает работу, как программистам, так и пользователям. Например, сессии используются после авторизации пользователя на сайте: держат в памяти сервера данные о том, что пользователь был авторизован, и что теперь ему можно дать некоторые права администрирования или использования сайта (комментирование, просмотр закрытых для гостей страниц или же написание-редактирование-удаление новостей на сайте, etc.).
Сессии в PHP используются там, где нужно удержать данные о пользователе между транзакциями. То есть, каждый новый запрос выполняется как новый, без всякой связи с предыдущим, и вот как раз сессия играет роль недостающего звена, которое бы связало эти два запроса.
Так же сессии играют некую роль секьюрити. Как это понимать и что это за трактование? А понять просто, это банальная защита интерактивных частей сайта от нежелательной информации (то есть спама).
Перед изучением урока, я рекомендую скачать исходник себе на компьютер!
Как работают сессии PHP?
Первым делом идентифицируется браузер. Ему выдается уникальный идентификатор, который будет передаваться при каждом запросе.
Идентификатор – это обычная переменная с неким значением. По умолчанию её имя PHPSESSID.
И цель PHP заключается в том, чтобы передать (двумя способами) эту переменную браузеру, чтобы тот, в свою очередь, вернул её со следующим запросом.
Грубо говоря, на сервере создается файл со всеми переменными для созданной сессии (+устанавливается период жизни сессии). И при открытии сессии в каком-то PHP файле, то сразу же идет запрос о получении id с cookies (см. выше — PHPSESSID), если нет таковой cookie с именем PHPSESSID , то создается новая сессия. Ну а если есть PHPSESSID, то с сервера загружается все связанное с предыдущей сессией. (Например, зарегистрированные переменные сессии).
Способы передачи значение переменной PHPSESSID
Через Cookies
Через URL
Кратко о способах
В браузер записывается cookie с именем PHPSESSID, естественно, если пользователь разрешил записывать их у себя в браузере. Подробнее о cookies можно почитать здесь, на этом сайте.
Через URL – PHP дописывает к каждой ссылке передачу id сессии (как для меня, это не очень удобно).
Итог: Кроме разрешения пользователя на использование cookie при передаче id сессии, можно так же задавать разрешение для PHP в файле php.ini для таких вот строк:
session.use_cookies = (1 – разрешить cookies, 0 — запретить)
session.use_trans_sid = (1 – разрешить передачу id сессии через url, 0 — запретить)
А вот и скриншот того, как должен выглядеть cookie PHPSESSID в браузере
Комментарий к скриншоту: как вы видите, я имею cookie PHPSESSID для домена sessions.gromitsu. Как я это получил? Все просто. Я создал файл index.php в корне домена sessions.gromitsu и открыл-закрыл в нем сессию.
1 2 3 4 5 |
<?php session_start(); session_unset(); session_destroy(); ?> |
Установка (открытие) сессии PHP
Открытие сессии PHP производится при помощи функции session_start(), которая (ВНИМАНИЕ!) вызывается в самом начале php файла. Иначе вылезет ошибка (см. ниже).
1 |
session_start(); |
Эта функция проверяет, существует ли PHPSESSID (или в cookies, или в ссылке (метод GET или POST)). Если да, загружает зарегистрированные переменные сессии, если нет, то создает новую сессию.
Регистрация переменных и удаление сессии
Регистрация переменных сессии.
Существует суперглобальный массив $_SESSION, который содержит в себе все сохраненные данные на протяжении всей сессии. Оперировать этим суперглобальным массивом так же просто, как и с простым.
1 2 |
$_SESSION[‘yourname’] = "Vasya"; // сохраняем имя Вася в суперглобальный массив $_SESSION. Вместо yourname может быть что угодно. |
Вывод определенных данных с $_SESSION
1 |
echo $_SESSION[‘yourname’]; //выведет Vasya |
Ещё добавлю, что регистрировать переменные можно, как и массивы. О чем я? Смотрите ниже.
1 2 3 4 5 |
<?php session_start(); $_SESSION['somearray'] = array('hello','world'); // echo $_SESSION['somearray'][0]; ?> |
Закрытие сессии
Закрытие сессии производится, как вы уже видели, при помощи функций session_unset() (освобождение всех переменных сессии от значений) и session_destroy() (закрытие сессии).
Разработаем простой скрипт инициализации имени пользователя на одной странице, удаление сессии и вывода приветствия с именем этого пользователя на другой странице.
pageone.php
1 2 3 4 5 |
<?php session_start(); // Отрываем сессию $_SESSION['user'] = 'Вася'; // регистрируем переменную user через суперглобальный массив $SESSION со значением "Вася" ?> <a href="pagetwo.php">Перейти на вторую страницу</a> |
pagetwo.php
1 2 3 4 5 |
<?php session_start(); // Стартуем сессию. echo "Приветствую вас, ".$_SESSION['user']; //Выведем имя пользователя через суперглобальный массив $_SESSION session_destroy(); //уничтожим все данные, хранящейся в суперглобальном массиве $_SESSION ?> |
Ну и страница, до которой данные сессии не сохранились. Сценарий такой же как и в pagetwo.php
pagethree.php
1 2 3 4 |
<?php session_start(); // Для работы с сессиями, их нужно сначала запустить (открыть, стартонуть) echo "Приветствую вас, ".$_SESSION['user']; //Выведем имя пользователя через суперглобальный массив $_SESSION ?> |
Напоследок поговорим о ЕРРОРАХ, которые могут возникнуть в процессе обучения.
Warning: Cannot send session cookie — headers already sent
Warning: Cannot send session cache limiter — headers already sent
Эти ERRORS говорят о том, что ещё до использования функции session_start() был передан хоть один HTTP заголовок. Что это? При общении сервера и браузера сначала идет запрос на сервер, откуда потом сначала возвращается HTTP заголовок, а потом вся информация, которую вы запрашивали. Так вот, в PHP для удобства придумали так, чтобы функции header(), set_cookie(), session_start() передавали сами HTTP заголовки. И вот, неопытный программист, ещё до выполнения одной из выше написанных функций, имел неосторожность поставить лишний символ (пробел, цифру, букву). Так вот, до функций header(), set_cookie(), session_start() не должно стоять никакого символа. Абсолютно никакого! Тогда все будет работать на УРА!
На этом, урок по работе с сессиями в PHP, окончен. Буду рад Вашим комментариям и вопросам.
С уважением, Влад Паук.
Автор: Влад Паук
Редакция: Рог Виктор и Андрей Бернацкий. Команда webformyself.
E-mail: contact@webformyself.com
Проект webformyself.com — Как создать свой сайт. Основы самостоятельного сайтостроения
"Киберсант-вебмастер" — самый полный курс по сайтостроению в рунете!
P.S. Хотите опубликовать интересный тематический материал и заработать? Если ответ «Да», то жмите сюда.
Комментарии (33)