PHP Учебник

PHP Старт Введение в PHP Установка PHP Синтаксис PHP Комментарии в PHP Переменные PHP PHP Echo / Print Типы данных PHP Строки PHP Числа PHP Математика в PHP Константы PHP Операторы PHP PHP If...Else...Elseif PHP Switch Циклы в PHP Функции PHP Массивы PHP PHP Суперглобальные PHP RegEx

PHP Формы

Обработка форм PHP Валидация форм PHP Обязательные поля Валидация URL/E-mail Полная форма PHP

PHP Продвинутый

PHP Дата и время PHP Include/Require PHP Работа с файлами Открытие/Чтение файлов Создание/Запись файлов PHP Загрузка файлов Файлы cookie PHP Сессии PHP Фильтры PHP Расширенные фильтры PHP Функция Callback PHP JSON PHP Исключения

PHP OOP

Что такое ООП в PHP Классы/Объекты PHP Цепочки методов PHP Конструктор PHP Деструктор PHP Модификаторы доступа Наследование в PHP Константы класса PHP Подсказка типов PHP Подсказка интерфейсов Абстрактные классы PHP PHP Интерфейсы PHP Полиформизм PHP Трейты Статические методы PHP Статические свойства PHP Пространства имен PHP Итерируемые объекты

База данных MySQL

База данных MySQL Подключение к MySQL Создание БД MySQL Создание таблицы MySQL Вставка данных MySQL Получить ID MySQL Подготовленные операторы PHP MySQL Получение данных MySQL Предложение WHERE Предложение ORDER BY Обновление данных MySQL Удаление данных БД MySQL Limit Data

PHP XML

Парсеры PHP XML Парсер PHP SimpleXML Получить PHP SimpleXML PHP XML Expat PHP XML DOM

PHP - AJAX

AJAX Введение AJAX PHP AJAX База Данных AJAX XML AJAX Живой поиск AJAX Опрос

PHP Примеры

PHP Примеры Практика ООП PHP PHP квиз-тест Упражнения Базовый PHP Упражнения Алгоритмы Упражнения Массивы Упражнения Цикл for Упражнения Функции Регулярные выражения Упражнения Дата PHP Упражнения Строки PHP Математика PHP Упражнения Формы PHP Упражнения Классы PHP Упражнения JSON PHP PHP Задачник


Сессии в PHP




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


Известно, что веб-сервер не поддерживает постоянного соединения с посетителем, и каждый запрос обрабатывается, как новый, без связи с предыдущими. А это означает, что сервер не может запоминать конкретного посетителя между несколькими запросами, т.е. при доступе к веб-странице сервер отвечает за предоставление содержимого только конкретной запрашиваемой страницы. Часто возникает необходимость отображать информацию определенного пользователя на всех страницах и, при этом, вам нужно аутентифицировать пользователя в каждом запросе. Представьте, что вам нужно было бы вводить логин и пароль пользователя на каждой странице, где была представлена ваша информация о профиле. Это было бы вообще не практично, и именно в таких случаях необходимы сессии.

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

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

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

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

Расположение временного файла определяется настройкой в файле php.ini в директиве session.save_path.

Пример использования в файле php.ini:

session.save_path = "/var/www/my_site/data/tmp"

Изменить директорию для хранения файлов сессий можно добавив в файл .htaccess:

php_value session.save_path "/var/www/my_site/data/tmp"

Перед использованием любой переменной сеанса убедитесь, что вы установили этот путь.

Когда сессия стартует, происходит следующее:

  • Сначала PHP создает уникальный идентификатор для этой конкретной сессии, который представляет собой случайную строку из 32 шестнадцатеричных чисел, например 5c9foj24c3jj973hjkop2fc937e3463.

  • Файл cookie под названием PHPSESSID автоматически отправляется на компьютер пользователя для хранения уникальной строки идентификации сессии.

  • Файл автоматически создается на сервере в назначенном временном каталоге и имеет имя уникального идентификатора с префиксом sess_, т.е. sess_5c9foj24c3jj973hjkop2fc937e3463.

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

С помощью специальных функций мы можем получить данный идентификатор:

echo session_id(); // идентификатор сессии
echo session_name(); // имя - PHPSESSID

То же значение мы могли бы получить, обратившись к cookie напрямую:

echo $_COOKIE['PHPSESSID'];

Сессия заканчивается, когда пользователь закрывает браузер или покидает сайт, сервер завершает сеанс через заранее определенный период времени, обычно продолжительностью 30 минут.

Сессию PHP легко запустить, вызвав функцию session_start(). Эта функция сначала проверяет, запущена ли уже сессия, и если она не запущен, запускает её.

Переменные сессии хранятся в суперглобальном массиве $_SESSION[]. Доступ к этим переменным можно получить в течение всего сеанса.

В следующем примере запускается сессия, а затем регистрируется переменная с именем counter, которая увеличивается каждый раз при посещении страницы во время сессии.

Чтобы проверить, установлена ​​ли уже переменная сессии или нет мы будем использовать функцию isset().

Поместите этот код в файл test.php и загрузите его несколько раз, чтобы увидеть результат:

<?php
   session_start();
   
   if( isset( $_SESSION['counter'] ) ) {
       $_SESSION['counter'] += 1;
   }else {
      $_SESSION['counter'] = 1;
   }
   
   $msg = "Вы посетили эту страницу ".  $_SESSION['counter']. " раз";
   $msg .= " в этой сессии.";
?>

<html>
   
   <head>
      <title>Настройка сессии PHP</title>
   </head>
   
   <body>
      <?php  echo ( $msg ); ?>
   </body>
   
</html>

Примечание: Функция session_start() должна быть объявлена в самом начале вашего документа — ПЕРЕД всеми html-тегами.

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

Также обратите внимание, что все значения переменных сессии хранятся в суперглобальной переменной $_SESSION.

Создадим еще одну страницу под названием test2.php. С этой страницы мы получим доступ к информации о сессии, которую мы установили на первой странице test.php:

<?php
   session_start();  
?>
<!DOCTYPE html>
<html>
<body>

<?php
// Значение переменной сессии, которая была установлена на предыдущей странице
echo "Значение переменной counter: " . $_SESSION['counter'] . ".";
?>

</body>
</html>

Ещё один способ показать все значения переменных сессии для пользовательского сеанса — запустить следующий код:

<?php
   session_start();  
?>
<!DOCTYPE html>
<html>
<body>

<?php
print_r($_SESSION);
?>

</body>
</html>

Чтобы изменить переменную сессии, достаточно просто её перезаписать. Поменяем значение переменной counter из предыдущих примеров с числа на строку:

<?php
   session_start();  
?>
<!DOCTYPE html>
<html>
<body>

<?php
// чтобы изменить переменную сессии, просто перезапишите ее
$_SESSION['counter'] = "PHP";
print_r($_SESSION);
?>

</body>
</html>

Чтобы удалить все глобальные переменные сессии и уничтожить сессию, используйте функции session_unset() и session_destroy():

<?php
   session_start();  
?>
<!DOCTYPE html>
<html>
<body>

<?php
// удалить все переменные сессии
session_unset();

// уничтожить сессию
session_destroy();
?>

</body>
</html>

Вам не обязательно вызывать функцию start_session() для запуска сессии, когда пользователь посещает ваш веб-сайт, вместо этого вы можете в файле php.ini установить для переменной session.auto_start значение 1.

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

В качестве альтернативы вы можете использовать константу SID, которая устанавливается при запуске сессии. Если клиентское ПО не хранит подходящую сессионную cookie, SID имеет вид session_name=session_id. В противном случае содержит пустую строку. Таким образом, вы можете в любом случае внедрять его в URL.

В следующем примере показано, как зарегистрировать переменную и правильно установить ссылку на другую страницу с помощью SID:

<?php
   session_start();
   
   if (isset($_SESSION['counter'])) {
       $_SESSION['counter'] += 1;
   }else {
      $_SESSION['counter'] = 1;
   }
   
   $msg = "Вы посетили эту страницу ".  $_SESSION['counter'];
   $msg .= " раз.";
   
   echo ( $msg );
?>

<p>
   Чтобы продолжить, нажмите следующую ссылку <br />
   
   <a  href = "nextpage.php?<?php echo htmlspecialchars(SID); ?>">
</p>

Функция htmlspecialchars() может использоваться для вывода SID с целью предотвращения XSS-атак.