PHP. Сессии

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

Расположение временного файла можно узнать через настройки в файле php.ini, который содержит параметр session.save_path. Как правило, папка имеет имя tmp.

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

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

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

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

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

Открытие сессии

Сессия PHP открывается с помощью функции session_start(). Эта функция сначала проверяет открытые сессии, если ни одна сессия не открыта, запускает ее. Рекомендуется поместить вызов session_start() в начало страницы. Переменные сеанса хранятся в суперглобальном ассоциативном массиве $_SESSION[]. Доступ к этим переменным можно получить во время сессии.

Код для примера. Сначала откроем сессию, затем зарегистрируем переменную с именем visit, которая увеличивается каждый раз, когда страница посещается во время сеанса. Используйте функцию isset(), чтобы проверить, установлена ли уже переменная сессии или нет.


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

Результат. Можете перезагрузить страницу, чтобы увидеть работу счётчика.

Вы посещали эту страницу 1 в текущей сессии.

Вы можете открыть страницу в другой вкладке, но счётчик "узнает" вас и будет увеличиваться. Вы можете закрыть все вкладки и через некоторое время открыть страницу снова. Счётчик по-прежнему работает и не сбрасывается.

Также можно сохранять не одно значение, а целый массив.


  $cats = array("Барсик", "Мурзик", "Рыжик");

  $_SESSION['cats'] = $cats;

Выводим массив на страницу.

Барсик, Мурзик, Рыжик


<?php echo ($_SESSION['cats'][0].', '.$_SESSION['cats'][1].', '.$_SESSION['cats'][2]); ?>

Удаление сессии

Сессия может быть удалена с помощью функции session_destroy(). Через один вызов можно удалить все переменные сеанса. Если вы хотите удалить одну переменную сессии, вы можете использовать функцию unset(), чтобы отключить ее. Ниже приводится пример, в котором отменяется одна переменная:


<?php
    unset($_SESSION['visit']);
?>

Вызов, который удаляет все переменные сессии:


<?php
    session_destroy();
?>

Включение автосессии

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

Сессии без файлов cookie

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


<?php
session_start();
 
if (isset($_SESSION['visit'])) {
    $_SESSION['visit'] = 1;
}else {
    $_SESSION['visit']++;
}

$msg = "Вы посещали эту страницу ".  $_SESSION['visit'];
$msg .= " в текущей сессии.";

echo ( $msg );
?>

<p>To continue  click following link <br />
<a  href = "nextpage.php?<?php echo htmlspecialchars(SID); ?>">
</p>

Этот код сформирует ссылку, на которую можно щёлкнуть.

Сессия между страницами

Данные запоминаются, нужно только извлекать нужные значения.


$_SESSION['username'] = "Васька";

<p><b>
<?php echo 'Привет, '.$_SESSION['username']."<br>"; ?>
</b></p>

<p><a href="session2.php">На следующую страницу </a></p>

Привет, Васька

На следующую страницу

Реклама