Как очистить $_SESSION
Не нашел способа как очистить. При отладке использую активно.
unset($_SESSION); // не работает $_SESSION['tests'][. ] = . ; unset($_SESSION['tests']); // вариант конечно, но есть свои недостатки..
Еще идеи какие-нибудь есть? п.с. пока использую
$_SESSION = []; // выдает ошибку, но потом когда закомментишь - очищено получается
Вот какое решение устроило меня на Yii:
foreach ( array_keys($_SESSION) as $key => $value ) < if ( $key >= 5) < // первые 5 элементов нужны //unset($_SESSION[$key]); // не работает, хотя кое-где используют http://www.yiiframework.com/doc/api/1.1/CHttpSession#clear-detail unset($_SESSION[$value]); >>
Как очистить session php
Сессии представляют набор переменных, которые хранятся на сервере (либо часть на сервере, а часть — в cookie браузера) и которые относятся только к текущему пользователю. В какой-то степени сессии являются альтернативой кукам в плане сохранения данных о пользователе.
Для запуска сессии необходимо вызвать функцию session_start() . Она должна вызываться до отправки ответа пользователю:
При запуске сессии с помощью функции session_start() , если пользователь первый раз заходит на сайт, PHP назначает ему уникальный идентификатор сессии. Этот идентификатор с помощью cookie, которые по умолчанию называются «PHPSESSID», сохраняется в браузере пользователя. С помощью этого идентификатора пользователь ассоциируется с данными сессии. Если для пользователя уже установлена сессия, то данная функция продлевает текущую сессию вместо установки новой.
С помощью специальных функций мы можем получить идентификатор сессии:
session_start(); echo session_id(); // идентификатор сессии echo session_name(); // имя - PHPSESSID
То же значение мы могли бы получить, обратившись к cookie напрямую:
echo $_COOKIE["PHPSESSID"];
Затем для сохранения или получения данных в сессии надо использовать глобальный ассоциативный массив $_SESSION . Сохранение переменной в сессии:
$_SESSION["имя_переменной"] = значение;
Получение сохраненного значения:
$переменная = $_SESSION["имя_переменной"];
Сохранение данных в сессии
Запустим сессию и сохраним в ней значения:
После установки сессии в браузере мы сможем заметить установку специальной куки, которая по умолчанию называется «PHPSESSID»:
SESSION» />SESSION» />
Получение данных сессии
Теперь получим эти значения и выведем на страницу:
session_start(); if (isset($_SESSION["name"]) && isset($_SESSION["age"])) < $name = $_SESSION["name"]; $age = $_SESSION["age"]; echo "Name: $name
Age: $age"; >
Удаление данных сессии
Сессия уничтожается с закрытием браузера, однако мы также можем программно удалить либо какие-то отдельные, либо все данные сессии.
Для удаления одной переменной из сессии применяется функция unset() :
session_start(); unset($_SESSION["age"]); // удаляем из сессии переменную "age"
Удалить все данные сессии можно с помощью функции session_destroy() :
session_start(); session_destroy();
Удаление сессий PHP
Стандартно в PHP сессии сохраняются в файлах. После окончания срока жизни сессии её файл удаляется. Но удаление выполняется с определённой вероятностью на «хитах». То есть при загрузке страниц сайта.
Если посещаемость сайта высока, а время жизни сессии достаточно большое, то объём всех файлов сессий может достигать десятков гигабайт. Очевидно, что в таких условиях на удаление старых сессии придётся потратить значительное время. И пользователь сайта не увидит страницу до тех пор, пока процедура не завершится.
Этой проблемы можно избежать, если отключить проверку сессий на хитах. И проводить её только на отдельной задаче, которая будет запускаться по CRON планировщику. Так пользователи не будут участвовать в процессе удаления старых сессий совсем. Что ускорит сайт.
Отключение проверки сессий на хитах
В конфигурационном файле apache для PHP можно прописать две директивы: session.gc_probability и session.gc_divisor. Они задают вероятность запуска процесса по удалению удаления старых сессий (на каждой 100-ой загрузке страницы сайта).
session.gc_divisor в сочетании с session.gc_probability определяет вероятность запуска функции сборщика мусора (gc, garbage collection) при каждой инициализации сессии. Вероятность рассчитывается как gc_probability/gc_divisor. То есть 1/100 означает, что функция gc запускается в одном случае из ста, или 1% при каждом запросе. session.gc_divisor по умолчанию имеет значение 100.
Для остановки стандартной функции удаления старых сессий достаточно задать session.gc_probability = 0. Делается это в файле .htaccess, в корневой директории сайта:
php_value session.gc_probability 0
Если добавить эту директиву и оставить всё как есть, то файлы сессий будут копиться до тех пор, пока весь диск хостинге не закончится. Поэтому нужно сделать свой механизм удаления сессий.
Удаление старых сессий по CRON заданию
Напишем CRON задание в файле /etc/crontab , в котором будет происходить весь процесс удаления просроченных файлов сессий. Приведём это задание сразу, а потом рассмотрим его составляющие (далее одна длинная-длинная строка задания):
0 * * * * mousedc /usr/bin/php -d session.save_path=/tmp/php_sessions/mousedc.ru -d session.gc_probability=1 -d session.gc_divisor=1 -d session.gc_maxlifetime=7776000 -r «session_start(); session_destroy();» &>/dev/null
- 0 * * * * — означает, что команда запускается раз в час
- mousedc — имя пользователя, запускающего команду. Должно совпадать с тем, от которого которого выполняются скрипты сайтов. Иначе доступа к сессионной папке у пользователя не будет, а без прав доступа скрипт не сработает.
- /usr/bin/php — обработчик php
- -d session.save_path=/tmp/php_sessions/mousedc.ru — директива, которая указывает на папку, где хранятся сессии сайта. Можно посмотреть её в phpinfo() в значении «session.save_path»
- «-d session.gc_probability=1» и «-d session.gc_divisor=1» — оба значения ставим одинаковыми, чтобы получить 100% вероятность срабатывания. Тогда при каждом запуске будет инициирован процесс удаления старых сессий
- -d session.gc_maxlifetime=7776000 — директива, определяющая максимальную продолжительность жизни сессии. Время жизни сессии — это количество секунд, прошедшее с последнего изменения сессионного файла. 7776000 секунд — это 90 дней. По умолчанию gc_maxlifetime = 1440. Задайте то значение, которое не меньше, чем используемое на сайте. Иначе сессии будут удаляться раньше, чем нужно.
- -r «session_start(); session_destroy();» — для инициации процесса очистки достаточно вызвать функцию создания сессии. А уничтожаем, чтобы и её файла не существовало.
- &>/dev/null — стирает оба потока вывода, чтобы ничего лишнего не записывалось в CRON журнал.
PHP. Сессии
Сессия создаёт файл во временном каталоге на сервере, в котором хранятся зарегистрированные переменные сессии и их значения. Эти данные будут доступны для всех страниц сайта во время этого посещения.
Расположение временного файла можно узнать через настройки в файле php.ini, который содержит параметр session.save_path. Как правило, папка имеет имя tmp.
При открытии сессии создаётся уникальный идентификатор для этой конкретной сессии, который представляет собой случайную строку из 32 шестнадцатеричных чисел.
Файл-куки PHPSESSID автоматически сохраняется на компьютере пользователя для хранения уникальной строки идентификации сессии.
На сервере в указанном временном каталоге автоматически создаётся файл, который содержит имя уникального идентификатора с префиксом sess_.
Когда PHP-скрипт хочет получить значение из переменной сессии, PHP автоматически получает уникальную строку идентификатора сессии из файла cookie PHPSESSID, а затем ищет во временном каталоге файл с этим именем и выполняет проверку путём сравнения обоих значений.
Сессия заканчивается, когда пользователь закрывает браузер или покидает сайт, сервер завершает сессию по истечении заданного периода времени, обычно 30 минут.
Открытие сессии
Сессия PHP открывается с помощью функции session_start(). Эта функция сначала проверяет открытые сессии, если ни одна сессия не открыта, запускает ее. Рекомендуется поместить вызов session_start() в начало страницы. Переменные сеанса хранятся в суперглобальном ассоциативном массиве $_SESSION[]. Доступ к этим переменным можно получить во время сессии.
Код для примера. Сначала откроем сессию, затем зарегистрируем переменную с именем visit, которая увеличивается каждый раз, когда страница посещается во время сеанса. Используйте функцию isset(), чтобы проверить, установлена ли уже переменная сессии или нет.
else < $_SESSION['visit'] = 1; >$msg = "Вы посещали эту страницу ". $_SESSION['visit']; $msg .= " в текущей сессии."; ?> Session
Результат. Можете перезагрузить страницу, чтобы увидеть работу счётчика.
Вы посещали эту страницу 1 в текущей сессии.
Вы можете открыть страницу в другой вкладке, но счётчик «узнает» вас и будет увеличиваться. Вы можете закрыть все вкладки и через некоторое время открыть страницу снова. Счётчик по-прежнему работает и не сбрасывается.
Узнать идентификатор сессии можно через функцию session_id().
echo session_id();
2419f2e2475f5b70e35336f1b7b79aea
Интересно, что через эту же функцию с одним аргументом, который принимает идентификатор сессии, можно заменить идентификатор, который генерирует система. Но в этом случае функцию следует использовать до session_start().
session_id(YOUR_SESSION_ID); session_start();
Также можно сохранять не одно значение, а целый массив.
$cats = array("Барсик", "Мурзик", "Рыжик"); $_SESSION['cats'] = $cats;
Выводим массив на страницу.
Барсик, Мурзик, Рыжик
Удаление сессии
Сессия может быть удалена с помощью функции session_destroy(). Через один вызов можно удалить все переменные сеанса. Если вы хотите удалить одну переменную сессии, вы можете использовать функцию unset(), чтобы отключить ее. Ниже приводится пример, в котором отменяется одна переменная:
Вызов, который удаляет все переменные сессии:
Включение автосессии
Вам не нужно вызывать функцию start_session(), чтобы открыть сессию, при посещении пользователем сайта, если вы установите переменную session.auto_start в файле php.ini.
Сессии без файлов cookie
Пользователь может запретить хранить файлы cookie на своем компьютере. Поэтому существует другой способ отправки идентификатора сеанса в браузер. Вы можете использовать константу SID, которая определяется, если сеанс запущен. Если клиент не отправил соответствующий сессии файл cookie, она выглядит как session_name = session_id. В противном случае она расширяется до пустой строки. Таким образом, вы можете вставлять ее в URL-адреса. В следующем примере показано как правильно регистрировать переменную и как правильно ссылаться на другую страницу с использованием SID.
else < $_SESSION['visit']++; >$msg = "Вы посещали эту страницу ". $_SESSION['visit']; $msg .= " в текущей сессии."; echo ( $msg ); ?> To continue click following link
">
Этот код сформирует ссылку, на которую можно щёлкнуть.
Сессия между страницами
Данные запоминаются, нужно только извлекать нужные значения.
Привет, Васька
Нажмите на ссылку выше, чтобы увидеть, как работает сессия между страницами.