Php записать данные сессии без закрытия. Подводные камни использования сессий в PHP

Функции обращения к сессиям

Поддержка сессий в PHP - это способ сохранения определённых данных в течение последовательно выполняемых доступов. Это даёт возможность создать более специализированные приложения и увеличить привлекательность вашего web-сайта.

Если вы знакомы с обслуживанием сессий с помощью PHPLIB, вы заметите, что некоторые вопросы аналогичны поддержке сессий в PHP.

Посетителю вашего сайта присваивается уникальный id, так называемый session id. Он хранится в куке на стороне пользователя или вводится в URL.

Поддержка работы с сессиями даёт вам возможность регистрировать произвольное количество переменных и сохранять их в промежутках между выполнениями запросов. Когда пользователь заходит на ваш сайт, PHP будет автоматически (если session.auto_start имеет значение 1) или по вашему запросу (явно - через session_start() или неявно - через session_register() ) проверять, выслан ли специфический session id вместе с запросом. Если это так, воссоздаётся предшествующее окружение.

Все зарегистрированные переменные сериализуются после окончания запроса. Зарегистрированные undefined-переменные маркируются как не определённые. При последующих запросах они не определяются модулем сессии, если только пользователь не определить их позднее.

Использование $_SESSION (или $HTTP_SESSION_VARS в PHP 4.0.6 или ранее) рекомендовано из соображений безопасности и читаемости кода. При наличии переменных $_SESSION или $HTTP_SESSION_VARS нет необходимости использовать функции session_register()/session_unregister()/session_is_registered(). Пользователи могут получать доступ к переменной сессии как к нормальной переменной.

Пример 2. Дерегистрация переменной с помощью $_SESSION

session_start ();
// Use $HTTP_SESSION_VARS with PHP 4.0.6 or less
unset($_SESSION [ "count" ]);
?>
Внимание!

Если вы используете $HTTP_SESSION_VARS / $_SESSION и отключили register_globals , не используйте session_register() , session_is_registered() и session_unregister() .

параметр URL

Модель сессий поддерживает оба метода. Куки являются оптимальными, но, поскольку это ненадёжно (клиенты могут их не принимать), мы не можем полагаться на них. Второй метод внедряет session id непосредственно в URL.

PHP способен делать это прозрачно при компилировании с опцией --enable-trans-sid . Если вы включили эту опцию, относительные URI изменятся и будут содержать session id автоматически. Альтернативно вы можете использовать константу SID , которая определена, если клиент не отправил соответствующую куку. SID имеет форму session_name=session_id или пустой строки.

Примечание: Директива arg_separator.output php.ini позволяет специализировать разделитель аргументов.

Следующие пример демонстрирует, как зарегистрировать переменную и как корректно связаться с другой страницей, используя SID.

Пример 5. Подсчёт количества входов отдельного пользователя

if (! session_is_registered ("count" )) {
session_register ("count" );
$count = 1 ;
} else {
$count ++;
}
?>

Hello visitor, you have seen this page times.

To continue, ">click
here.

SID?> не нужен, если --enable-trans-sid использовалась при компиляции PHP.

Примечание: Принимается, что не-относительные URL указывают на внешние сайты и, следовательно, не присоединяют SID, так как имеется риск утечки информации о SID на другой сервер.

Для реализации хранения в БД или другого метода вам понадобится использовать session_set_save_handler() для создания набора функций хранения уровня пользователя.

Конфигурация

Рассмотрим конфигурационнык директивы по умолчанию:

Имя директивы Значение по умолчанию Примечания
session.save_path ""
session.name "PHPSESSID"
session.save_handler "files"
session.auto_start "0"
session.gc_probability "1"
session.gc_divisor "100" Доступна с PHP 4.3.2.
session.gc_maxlifetime "1440"
session.serialize_handler "php"
session.cookie_lifetime "0"
session.cookie_path "/"
session.cookie_domain ""
session.cookie_secure "" Доступна с PHP 4.0.4.
session.use_cookies "1"
session.use_only_cookies "0" Доступна с PHP 4.3.0.
session.referer_check ""
session.entropy_file ""
session.entropy_length "0"
session.cache_limiter "nocache"
session.cache_expire "180"
session.use_trans_sid "0" Доступна с PHP 4.0.3.
session.bug_compat_42 "1" Доступна с PHP 4.3.0.
session.bug_compat_warn "1" Доступна с PHP 4.3.0.
session.hash_function "0" Доступна с PHP 5.0.0.
session.hash_bits_per_character "4" Доступна с PHP 5.0.0.
url_rewriter.tags "a=href,area=href,frame=src,form=,fieldset=" Доступна с PHP 4.0.4.

Система менеджмента сессий поддерживает несколько опций конфигурации, которые вы можете поместить в ваш файл php.ini . Мы дадим краткий обзор.

    session.save_handler определяет имя обработчика хранения и запрашивания данных, ассоциированных с сессией. По умолчанию files .

    session.save_path определяет аргумент, который передаётся для хранения обработчика. Если вы выбрали обработчик файлов по умолчанию, это будет путь к месту создания файлов. По умолчанию /tmp . Если глубина пути для session.save_path больше 2, сборка мусора не будет выполняться.

    session.name специфицирует имя сессии, которое используется как имя куки. Оно должно содержать только буквы и цифры. По умолчанию PHPSESSID .

    session.auto_start специфицирует, стартует ли модуль сессий сессию автоматически при стартовом запросе. По умолчанию 0 (отключено).

    session.cookie_lifetime специфицирует период хранения куки в секундах. Значение 0 означает "пока браузер не будет закрыт." По умолчанию 0 .

    session.serialize_handler определяет имя обработчика для сериализации/десериализации данных. В настоящий момент поддерживается внутренний формат PHP (name php) и WDDX (name wddx). WDDX доступен только тогда, когда PHP скомпилирован с поддержкой WDDX . По умолчанию php .

    session.gc_probability специфицирует вероятность того, что утилита gc (garbage collection/сборщик мусора) стартует при каждом запросе, в процентах. По умолчанию 1 .

    session.gc_maxlifetime специфицирует количество секунд, после чего данные будут считаться "мусором" и зачищаться.

    session.referer_check содержит подстроку, которую вы можете проверять при каждом HTTP-обращении. Если обращение было выслано клиентом и подстрока не была найдена, внедрённый session id будет помечен как недействующий. По умолчанию - пустая строка.

    session.entropy_file задаёт путь ко внешнему ресурсу (файлу), который будет использован как дополнительный источник в процессе создания session id. Примеры: /dev/random или /dev/urandom , которые доступны на многих Unix-системах.

    session.entropy_length специфицирует количество байтов, которые будут прочитаны из файла специфицированного выше. По умолчанию 0 (отключено).

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

Давайте с Вами поработаем с сессиями в PHP . И начнём с функции session_start() . Данная функция делает следующее: если пользователь зашёл впервые, то создаёт уникальный идентификатор и записывает его в cookie , а также создаёт новый файл, вновь уникальный для пользователя. Если пользователь уже заходил, то тогда сервер считывает значение уникального идентификатора из cookie и, в соответствии с ним, обращается к нужному файлу сессии. Из этого файла PHP считывает все данные и помещает их в массив $_SESSION . Давайте напишем простой код, в котором мы записываем переменную в сессию, либо считываем, если она уже была записана.

session_start();
if (isset($_SESSION["name"])) $name = $_SESSION["name"];
else $_SESSION["name"] = "15St";
echo $name;
?>

Вначале мы вызываем функцию session_start() , которую я описал выше. Затем проверяем: существует ли переменная "name " в сессии. Если существует, то считываем из неё данные и записываем в переменную name . Если не существует (то есть пользователь пришёл в первый раз), то устанавливаем переменной "name " в сессии значение "15St. ". Следующей строкой выводим значение переменной $name . Очевидно, что при первом запуске, Вы увидите пустую строку, а вот при втором увидите строку "15St. ", считанную из сессии.

Советую Вам сейчас ввести в адресной строке: "javascript:document.cookie " (вводите на той же вкладке, что и запускали скрипт). В результате, Вы увидите примерно следующее: "PHPSESSID=". Как раз значение PHPSESSID и является тем самым уникальный идентификатором.

И чтобы всё стало совсем понятно, то советую даже найти файл сессии . Если Вы используете Denwer , то он лежит в папке "tmp ". Посмотрите на файлы, которые начинаются на "sess_ " - это и есть те самые файлы сессии . Вы можете их открыть в простом блокноте.

Ещё одно очень важное свойство - это временность сессий в PHP . То если cookie хранятся до тех пор, пока их не удалит браузер. А браузер их по умолчанию не удаляет никогда. То сессии хранятся время, заданное в настройках PHP . По умолчанию, это 15 минут. То есть если Вы будете использовать аутентификацию на основе сессии , то через 15 минут бездействия пользователя, ему снова придётся авторизоваться. Разумеется, это хорошо, так как если пользователь забудет "Выйти ", то ничего плохого не случится. Злоумышленник не сможет воспользоваться аккаунтом пользователя. Более того, при использовании cookie их можно выкрасть, подставить в своём браузере, и в результате злоумышленник авторизован под чужими данными, не зная даже пароля. А сессию украсть не получится, так как все параметры хранятся на сервере, и узнать о них не получится.

Поэтому старайтесь в своей практике преимущественно использовать сессии , а не чистые cookie .

И, напоследок, хочется предупредить об очень частой ошибке. Никогда не выводите данные в браузеры до использования функции session_start() , иначе она выдаст ошибку. То есть нельзя писать вот так:

echo "Hello";
session_start();
?>

При запуске данного скрипта возникнет ошибка. То же самое правило действовало и с cookie (функция setcookie() ). Так что, думаю, здесь всё понятно.

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

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

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

Идентификатор сессии, хранящийся на стороне клиента (на его компьютере) - это файл cookie . Куки хранятся в браузере пользователя, но при этом файл соответствующий создается также и на сервере.

Давайте перейдем непосредственно к практике.

Создаем сессию:

Самый элементарный способ здесь, применить функцию session_start:

1 2 // Запустить сессию session_start () ;

// Запустить сессию session_start();

Данная функция проверяет, есть ли идентификатор сессии, если его нет, то создает его. А если же, он имеется, то загружает зарегистрированные переменные из имеющейся сессии.

Такая конструкция должна быть вызвана только один раз для каждой страницы и до любого вывода (данное правило также подходит и для setcookie()).

Приведу пример, когда сессия создается в браузере, то кука там имеет следующий вид

Когда создается сессия в браузер ‛прилетает“ кука следующего вида:

1 2 echo "Название сессии: " . session_name () . " Идентификатор сессии: " . session_id () ; // Название сессии: PHPSESSID Идентификатор сессии: mceu371l97id3sa0vcbjqnht06

echo "Название сессии: ".session_name(). " Идентификатор сессии: ".session_id(); // Название сессии: PHPSESSID Идентификатор сессии: mceu371l97id3sa0vcbjqnht06

Создадим переменную сессии:

Переменную сессии можно создать добавив какое-то значение суперглобальному элементу массива $_SESSION:

unset($_SESSION["login"]);

Способ выше хорош, но можно очистить весь массив $_SESSION , тем самым мы удалим все переменные из сессии:

1 2 // Чистим наш массив $_SESSION $_SESSION = array () ;

// Чистим наш массив $_SESSION $_SESSION = array();

2. Теперь нам необходимо сделать файл куки недействительным (где имя сессии ссылается при обращении на session id в куках и URL):

1 2 3 if (isset ($_COOKIE [ session_name () ] ) ) { // session_name() - вытаскиваем название текущей сессии setcookie (session_name () , "" , time () - 86400 , "/" ) ; }

if (isset($_COOKIE)) { // session_name() - вытаскиваем название текущей сессии setcookie(session_name(), "", time()-86400, "/"); }

3. Ну и следом уничтожим сессию (закроем её):

session_start(); ob_start();

Вот более подробный пример кода с использованием ранее рассмотренных кодов и функций:

1 2 3 4 5 6 7 8 9 if (isset ($_SESSION [ "login" ] ) ) { echo "Привет, " . $_SESSION [ "name" ] . " " ; unset ($_SESSION [ "login" ] ) ; if (isset ($_COOKIE [ session_name () ] ) ) { setcookie (session_name () , "" , time () - 86400 , "/" ) ; // содержимым нашей сессии является пустая строка } ob_end_flush () ; // Отправляем браузеру вывод session_destroy () ;

if (isset($_SESSION["login"])) { echo "Привет, " . $_SESSION["name"] . " "; unset($_SESSION["login"]); if (isset($_COOKIE)) { setcookie(session_name(), "", time()-86400, "/"); // содержимым нашей сессии является пустая строка } ob_end_flush(); // Отправляем браузеру вывод session_destroy();

Однако стоит обратить внимание, что использование функции ob_end_flush() не всегда является обязательным. А всё потому что интерпретатор PHP автоматически чистит ваш буфер при выполнении какого-то сценария.

Пересоздадим идентификатор сессии:

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

Принцип работы сессий:

На скриншоте ниже вы можете узреть небольшой обзор самого механизма сессий.

Уменьшим время жизни сессии:

Стандартное значение времени жизни сессии равно 0, а именно, если пользователь закроет окно браузера, то сессия закроется тоже. Но возникает иногда необходимость уничтожить сессию клиента принудительно по истечению какого-то времени, например из-за не активности с его стороны на сайте. Разберем способ подобной реализации на примере aвторизации пользователя: мы создадим какую-то переменную и сохраним в ней время используемое при авторизации пользователя, к примеру если пользователь попытается обносить страницу, то мы сравниваем время с тем временем, которое он был неактивен, и в случае превышения данного лимита он будет разлогинен и отправлен на страницу авторизации.

1 2 3 4 5 6 7 8 $_SESSION [ "start" ] = time () ; // Начало времени, когда пользователь авторизовался $timezon = time () ; // Данное время (то которое есть сейчас) $time_limit = 2000 ; // Это максимальное время не активности пользователя if ($timezon & gt; $_SESSION [ "start" ] + $time_limit ) { echo "Время закончилось" ; } else { $_SESSION [ "start" ] = time () ; } // если всё хорошо, то обновляем

$_SESSION["start"] = time(); // Начало времени, когда пользователь авторизовался $timezon= time(); // Данное время (то которое есть сейчас) $time_limit = 2000; // Это максимальное время не активности пользователя if ($timezon> $_SESSION["start"] + $time_limit) { echo "Время закончилось"; } else {$_SESSION["start"] = time();} // если всё хорошо, то обновляем

Иногда возникает у людей вопрос "Как реализовать бесконечное время жизни сессии?" , тут ответ я дам вам такой. Этого не стоит делать, это в корне идеи уже есть не правильно. Сессия на то и дана, чтобы пользователь зашел на сайта - она открылась, он ушел - она закрылась (уничтожилась). Когда он опять зашел сессия открылась новая. Однако можно использовать для сессии данные из куки, которые могут храниться достаточно долго, к примеру при использовании галочки "Запомнить меня" (Помните ведь такую на сайтах?)...

Используем сессии при отключенном cookie:

Скажите такого не бывает? Увы и такое иногда встречается. Например если для настройки session.use_trans_sid мы установим значение 1 , то при отсутствии использования cookie, PHP будет передавать параметры PHPSESSID с использованием GET метода в вашей строке запроса.

Вот и всё, статья закончена. Если у вас еще остались вопросы касательно использования сессий, а может есть какие-то дополнения или замечания, то можете оставить всё в комментариях к данной статье.

Обработка сессии это ключевой приём в PHP, что позволяет хранить данные пользователя на всех страницах веб-сайта или приложения. Из этой статьи вы узнаете основы обработки сессии в PHP.

Мы начнем с объяснения того, как работают сессии и как они связаны с куки-файлами. Затем мы рассмотрим несколько фрагментов кода, демонстрирующих, как работать с сеансами. Вы узнаете, как создавать и уничтожать сеансы и как изменять переменные сеанса.

Что такое сессия в PHP?

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

Протокол HTTP - это протокол без учета состояния, что означает, что сервер не может сопоставить конкретного пользователя по несколькими запросами. Например, при доступе к веб-странице, сервер несёт ответственность за предоставление содержимого запрашиваемой страницы. Поэтому, когда вы обращаетесь к другим страницам одного и того же веб-сайта, веб-сервер интерпретирует каждый запрос отдельно, как если бы они не были связаны друг с другом. Серверу не известно, что каждый запрос исходит от одного и того же пользователя.

Следующая диаграмма вкратце изображает протокол HTTP.

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

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

Обработка входа с сессиями и файлами «куки» (cookie)

Давайте быстро рассмотрим общий пример входа на веб-сайт, чтобы понять, что происходит за кулисами.

  1. Пользователь открывает страницу входа на веб-сайт.
  2. После отправки формы входа, сервер, на другом конце, аутентифицирует запрос, проверив введённые учётные данные.
  3. Если учётные данные, введённые пользователем, верны, сервер создаёт новый сеанс. Сервер генерирует уникальное случайное число, которое называется идентификатором сеанса. Также, на сервере, создаётся новый файл, который используется для хранения информации, относящейся к сеансу.
  4. Затем, идентификатор сеанса передаётся обратно пользователю, вместе с тем, что он запросил. За кулисами этот идентификатор сеанса отправляется в заголовке ответа «куки» PHPSESSID (так называется по умолчанию).
  5. Когда браузер получает ответ от сервера, он получает заголовок куки-файла PHPSESSID . Если в браузере разрешены «куки», то он сохранит этот PHPSESSID , в котором хранится идентификатор сеанса, переданный сервером.
  6. Для последующих запросов, «кука» PHPSESSID передаётся обратно на сервер. Когда сервер получает «куку» PHPSESSID , он пытается инициализировать сеанс с этим идентификатором сеанса. Он делает это, загружая файл сеанса, который был создан ранее во время инициализации сеанса. Затем он инициализирует суперглобальную переменную массива $_SESSION с данными, хранящимися в файле сеанса.

Таким образом, пользовательские данные сохраняются даже в нескольких запросах, и пользователь не теряется на протяжении всего сеанса.

На следующей диаграмме показано, как протокол HTTP работает с сеансами.

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

Как запустить сессию

В этом разделе мы обсудим, как запустить сессию в PHP.

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

Использование функции session_start

Метод, в котором сессия запускается функцией session_start , вы будете видеть часто.

Важно, чтобы функция session_start вызывалась в начале скрипта, перед отправкой чего-либо браузеру. В противном случае, вы столкнётесь с печально известной ошибкой Headers are already sent .

Автоматический запуск сеанса

При необходимости применения сессий в приложении, есть возможность запускать сеанс автоматически без использования функции session_start .

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

Session.auto_start = 1

С другой стороны, если у вас нет доступа к файлу php.ini , и вы используете веб-сервер Apache, эту переменную можно задать с помощью файла .htaccess .

Php_value session.auto_start 1

Если вы добавите строку выше в ваш .htaccess файл, то это должно автоматически запускать сессии в вашем PHP-приложении.

Как получить идентификатор сеанса

Как мы уже рассмотрели ранее, сервер создаёт уникальный номер для каждой новой сессии. Если вы хотите получить идентификатор сеанса, можно использовать функцию session_id , как показано в следующем фрагменте.

Это должно выдать вам идентификатор текущего сеанса. Функция идентификатора session_id интересна тем, что она ещё может принимать один аргумент - идентификатор сеанса. Если вы хотите заменить сгенерированный системой идентификатор сеанса на ваш, это можно сделать, передав первый аргумент функции session_id .

Важно отметить, что если вы хотите начать сеанс с помощью своего идентификатора сеанса, функция session_id должна стоять перед вызовом session_start .

Создание переменных сеанса

В этом разделе мы изучим, как инициализировать переменные сессии в PHP.

Как мы уже обсудили, при запуске сеанса, инициализируется суперглобальный массив $_SESSION с соответствующей информацией о сессии. По умолчанию, он инициализируется в виде пустого массива, и вы можете хранить больше информации, используя пару ключ–значение.

Давайте рассмотрим следующий пример кода, который показывает, как инициализировать переменные сеанса.

Как видите, мы запустили сессию в начале скрипта, используя функцию session_start . После этого мы инициализировали несколько переменных сессии. Наконец, мы использовали эти переменные через суперглобальную переменную $_SESSION .

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

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

Как изменять и удалять переменные сеанса

Можно изменять или удалять переменные сеанса, созданные ранее в приложении так же, как обычные переменные PHP.

Давайте посмотрим, как изменять переменные сессии.

В приведённом выше коде, мы проверяем, установлена ли переменная $_SESSION["count"] . Если не установлена, мы устанавливаем её равной 1 , в противном случае, увеличим её на 1 . Таким образом, если вы обновите эту страницу несколько раз, вы должны увидеть, что счётчик, каждый раз, увеличивается на единицу!

С другой стороны, если вы хотите удалить переменную сеанса, вы можете использовать функцию unset , как показано в следующем фрагменте.

Таким образом, вы больше не сможете обращаться к переменной $_SESSION ["logged_in_user_id"] , поскольку она удалена функцией unset . Вот так вы можете изменить информацию о сеансе.

Как уничтожить сессию

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

Попробуем понять, как это работает в следующем примере.

Функция session_destroy удаляет всё, что хранится в текущем сеансе. Таким образом, с последующими запросами вы увидите пустую переменную $_SESSION , поскольку данные сеанса, хранящиеся на диске, были удалены функцией session_destroy .

Как правило, функцию session_destroy нужно использовать, когда пользователь выходит из системы.

Заключение

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

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

Сессии позволяют установить связь между посетителем и сайтом при помощи идентификатора сессии .

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

Идентификатор сессии, хранящийся на компьютере пользователя, это файл cookie .

Cookie хранится в браузере пользователя, при этом соответствующий файл создается и на сервере.

Создаем сессию

Самый простой способ открытия сессии заключается в использовании функции session_start:

// инициировать сессию session_start();

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

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

Когда создается сессия в браузер ‛прилетает“ кука следующего вида:

PHP

echo "Имя сессии: ".session_name(). " Идентификатор сессии: ".session_id(); // Имя сессии: PHPSESSID Идентификатор сессии: mceu820l02id3ds0vcvtgnht04

Создаем переменную сессии

Переменная сессии создается путем добавлением какого-либо значения суперглобальному массиву $_SESSION:

$_SESSION["nick"] = $_POST["name"];

Уничтожаем переменные сессии и саму сессию

1 . Удалить переменную сессии можно следующим образом:

Unset($_SESSION["nick"]);

Этим мы предотвратим повторное использование информации.

Но лучше просто очистить массив $_SESSION (удалить все переменные сессии):

//очистить массив $_SESSION $_SESSION = array();

2 . Также необходимо сделать следующее:

Установить файл cookie сессии недействительным:

If (isset($_COOKIE)) { // session_name() - получаем название текущей сессии setcookie(session_name(), "", time()-86400, "/"); }

Имя сессии ссылается на session id в куках и URL

3 . Уничтожить (завершить) сессиию

Session_destroy();

Буферизация вывода

Если у вас уже есть какой-либо вывод, вы можете воспользоваться фукцией ob_start() . Данная функция делает буферизацию вывода. Теперь вывод не будет отправлен браузеру, пока вы не отправите его принудительно при помощи функции ob_end_flush() .

"; unset($_SESSION["nick"]); if (isset($_COOKIE)) { setcookie(session_name(), "", time()-86400, "/"); // содержимое сессии - пустая строка } // setcookie сработает безошибочно, так как мы только сейчас ob_end_flush(); // отправили браузеру вывод session_destroy();

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

Пересоздаем идентификатор сессии

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

Механизм работы сессий


Уменьшаем время жизни сессии

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

$_SESSION["start"] = time(); // временная метка авторизации пользователя $now = time(); // текущее время $time_limit = 1000; // максимально допустимое время бездействия пользователя в сек. if ($now > $_SESSION["start"] + $time_limit) { echo "Ваше время истекло"; //....... // и удаляем сессию и ее cookie } else { $_SESSION["start"] = time(); } // если порядок, обновляем

Как сделать время жизни сессии вечной?

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

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

Работа с сессией при отключенных куках

Если для настройки session.use_trans_sid установить 1 , то при отключенных куках PHP будет передавать PHPSESSID методом GET в строке запроса.

2024 professiya-online.ru. Программы. Интернет. Windows. Советы. Гаджеты. Ноутбуки.