Yii Framework
Как изменить время действия сессии вручную из контроллера?
Как изменить время действия сессии вручную из контроллера?
Сообщение swprqa » 2015.03.23, 21:33
На забугорском форуме молчат, может тут кто знает.
Нужно как-то разлогинивать пользователя при закрытии вкладки, решил сделать следующим образом: на событии JS window.unload делать ajax запрос на сервер, сервер устанавливает время действия сессии 5-10 сек, при загрузке какой-то страницы пользователь снова делает запрос на сервер, сервер ставит значение сессии по-умолчанию.
Вопрос: как изменить время действия сессии из контроллера?
Re: Как изменить время действия сессии вручную из контроллера?
Сообщение lynicidn » 2015.03.23, 21:38
Re: Как изменить время действия сессии вручную из контроллера?
Сообщение lynicidn » 2015.03.23, 21:39
Re: Как изменить время действия сессии вручную из контроллера?
Сообщение swprqa » 2015.03.23, 22:06
Re: Как изменить время действия сессии вручную из контроллера?
Сообщение swprqa » 2015.03.23, 22:08
Re: Как изменить время действия сессии вручную из контроллера?
Сообщение lynicidn » 2015.03.23, 22:16
Re: Как изменить время действия сессии вручную из контроллера?
Сообщение swprqa » 2015.03.23, 22:21
Re: Как изменить время действия сессии вручную из контроллера?
Сообщение shkarbatov » 2015.03.23, 23:22
Самый верный вариант, это пинговать клиента. То есть, постоянно слать запросы с клиента, через определенный период времени (например 10 сек). Если ответа нет, через 10 сек +-5 сек, то удаляем данные по клиенту.
Плюс ко всему, учтите, что сервис может быть открыт и в разных вкладках. И если одну вкладку пользователь закроет (кука удалиться), а вторая должна работать, то куки надо будет разделять для вкладок, а это будет не очень весело.
Сессии и куки
Сессии #
По аналогии с запросами и ответами, к сессии можно получить доступ через session компонент приложения, который по умолчанию является экземпляром yii\web\Session.
Открытие и закрытие сессии #
Открыть и закрыть сессию можно следующим образом:
Можно вызывать open() и close() многократно без возникновения ошибок; внутри компонента все методы проверяют сессию на факт того, открыта она или нет.
Доступ к данным сессии #
Получить доступ к сохраненным в сессию данным можно следующим образом:
При работе с сессионными данными, являющимися массивами, компонент session имеет ограничение, запрещающее прямую модификацию отдельных элементов массива. Например,
Для решения этой проблемы можно использовать следующие обходные приемы:
Для улучшения производительности и читаемости кода рекомендуется использовать последний прием. Другими словами, вместо того, чтобы хранить массив как одну переменную сессии, мы сохраняем каждый элемент массива как обычную сессионную переменную с общим префиксом.
Пользовательское хранилище для сессии #
По умолчанию класс yii\web\Session сохраняет данные сессии в виде файлов на сервере. Однако Yii предоставляет ряд классов, которые реализуют различные способы хранения данных сессии:
Все эти классы поддерживают одинаковый набор методов API. В результате вы можете переключаться между различными хранилищами сессий без модификации кода приложения.
Чтобы узнать, как настроить и использовать эти компоненты, обратитесь к документации по API. Ниже приведен пример конфигурации yii\web\DbSession для использования базы данных для хранения сессии:
Также необходимо создать таблицу для хранения данных сессии:
где ‘BLOB’ соответствует типу данных предпочитаемой вами DBMS. Ниже приведены примеры соответствия типов BLOB в наиболее популярных DBMS:
Flash-сообщения #
Так как flash-сообщения хранятся в сессии как обычные данные, в них можно записывать произвольную информацию, и она будет доступна лишь в следующем запросе.
При вызове yii\web\Session::setFlash(), происходит перезаписывание flash-сообщений c таким же названием. Для того, чтобы добавить новые данные к уже существующему flash-сообщению, необходимо вызвать yii\web\Session::addFlash(). Например:
Note: Старайтесь не использовать yii\web\Session::setFlash() совместно с yii\web\Session::addFlash() для flash-сообщений с одинаковым названием. Это связано с тем, что последний метод автоматически преобразует хранимые данные в массив, чтобы иметь возможность хранить и добавлять новые данные в flash-сообщения с тем же названием. В результате, при вызове yii\web\Session::getFlash() можно обнаружить, что возвращается массив, в то время как ожидалась строка.
Чтение кук #
Получить куки из текущего запроса можно следующим образом:
Отправка кук #
Отправить куку конечному пользователю можно следующим образом:
Кроме свойств name и value, класс yii\web\Cookie также предоставляет ряд свойств для получения информации о куках: domain, expire. Эти свойства можно сконфигурировать и затем добавить куку в коллекцию для HTTP-ответа.
Валидация кук #
При использовании валидации кук необходимо указать значение свойства yii\web\Request::cookieValidationKey, которое будет использовано для генерации вышеупомянутого секретного ключа. Это можно сделать, настроив компонент request в конфигурации приложения:
Note: Свойство cookieValidationKey является секретным значением и должно быть известно только людям, которым вы доверяете. Не помещайте эту информацию под систему контроля версий.
Session timeout in Yii2
I have used built in yii2 function to set session. I am not able to use built in yii2 login because of some requirement.
So I have set session using below:
and in my config/main.php file
But still user is logged out from website after some time.
So how to increase session timeout in this case?
2 Answers 2
I will suggest you that if you want to destroy particular session only then set two session:
Check current time with code_time, once it is over unset both session.
if you want user should logout after certain time with current solution :
Problem is in cookies expire time. When it timed out, user is logout. Solution, for changing cookies expire time is in configuration for session component set for cookies lifetime:
When user login, cookies expire time in current example is after week.
Not the answer you’re looking for? Browse other questions tagged php session yii2 or ask your own question.
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.10.4.40368
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
p0vidl0.info
Кодинг, админинг и прочие развлечения
Yii2: Разбираемся с сессиями
Открытие и закрытие сессий
Простой код, иллюстрирующий работу с сессиями.
Многократный вызов методов open() и close() не приводит к ошибкам, так как, эти методы включают внутреннюю проверку на наличие открытой сессии.
Сохранение данных в сессии
Получение данных из сессии
Удаление значения из сессии
Проверка наличия данных в сессии
Получение всех данных сессии
Массивы в сессии
Flash сообщения с использованием сессий
Данный метод позволяет однократно отобразить flash сообщение и удалить данные о нем.
6 thoughts on “ Yii2: Разбираемся с сессиями ”
Здравствуйте, а в чем преимущество применения этих методов по сравнению с работой с обычными сессиями? Там есть какая-то фильтрация или что?
Добрый день. Принципиальных отличий нет. Подробности реализации можно увидеть в коде класса yii\web\Session.
Принципиальное различие в том, что в Yii2 можно легко заменить хранилище сессий. Допустим, если мне больше хочется использовать Redis или базу данных, чтобы снизить чтение-запись жесткого диска. В Yii2 это сделать гораздо проще, учитывая, что для этого есть специальный интерфейс.
Отличий в результате работы нет, отличие в удобвстве использования, yii2 даёт вам возможность юзать сессии и куки в ООП режиме, а не копаться в массивах, что значительно удобнее. Кроме того вы можете цепляя различные компоненты хранить куки в разных местах, будто просто таблица в БД, редис или mondoDB, код менять не придётся, просто цепляете нужный компонент и всё. Вот тут хорошо написано об этом: http://nix-tips.ru/yii2-api-guides/guide-ru-runtime-sessions-cookies.html
Получение всех данных сессии — получит массив __array и вызовет ошибку на echo
(проверено — именно так)
Сессии и куки ¶
Сессии ¶
По аналогии с запросами и ответами, к сессии можно получить доступ через session компонент приложения, который по умолчанию является экземпляром yii\web\Session.
Открытие и закрытие сессии ¶
Открыть и закрыть сессию можно следующим образом:
Можно вызывать open() и close() многократно без возникновения ошибок; внутри компонента все методы проверяют сессию на факт того, открыта она или нет.
Доступ к данным сессии ¶
Получить доступ к сохраненным в сессию данным можно следующим образом:
При работе с сессионными данными, являющимися массивами, компонент session имеет ограничение, запрещающее прямую модификацию отдельных элементов массива. Например,
Для решения этой проблемы можно использовать следующие обходные приемы:
Для улучшения производительности и читаемости кода рекомендуется использовать последний прием. Другими словами, вместо того, чтобы хранить массив как одну переменную сессии, мы сохраняем каждый элемент массива как обычную сессионную переменную с общим префиксом.
Пользовательское хранилище для сессии ¶
По умолчанию класс yii\web\Session сохраняет данные сессии в виде файлов на сервере. Однако Yii предоставляет ряд классов, которые реализуют различные способы хранения данных сессии:
Все эти классы поддерживают одинаковый набор методов API. В результате вы можете переключаться между различными хранилищами сессий без модификации кода приложения.
Чтобы узнать, как настроить и использовать эти компоненты, обратитесь к документации по API. Ниже приведен пример конфигурации yii\web\DbSession для использования базы данных для хранения сессии:
Также необходимо создать таблицу для хранения данных сессии:
где ‘BLOB’ соответствует типу данных предпочитаемой вами DBMS. Ниже приведены примеры соответствия типов BLOB в наиболее популярных DBMS:
Flash-сообщения ¶
Так как flash-сообщения хранятся в сессии как обычные данные, в них можно записывать произвольную информацию, и она будет доступна лишь в следующем запросе.
При вызове yii\web\Session::setFlash(), происходит перезаписывание flash-сообщений c таким же названием. Для того, чтобы добавить новые данные к уже существующему flash-сообщению, необходимо вызвать yii\web\Session::addFlash(). Например:
Примечание: Старайтесь не использовать yii\web\Session::setFlash() совместно с yii\web\Session::addFlash() для flash-сообщений с одинаковым названием. Это связано с тем, что последний метод автоматически преобразует хранимые данные в массив, чтобы иметь возможность хранить и добавлять новые данные в flash-сообщения с тем же названием. В результате, при вызове yii\web\Session::getFlash() можно обнаружить, что возвращается массив, в то время как ожидалась строка.
Чтение кук ¶
Получить куки из текущего запроса можно следующим образом:
Отправка кук ¶
Отправить куку конечному пользователю можно следующим образом:
Кроме свойств name и value, класс yii\web\Cookie также предоставляет ряд свойств для получения информации о куках: domain, expire. Эти свойства можно сконфигурировать и затем добавить куку в коллекцию для HTTP-ответа.
Валидация кук ¶
При использовании валидации кук необходимо указать значение свойства yii\web\Request::$cookieValidationKey, которое будет использовано для генерации вышеупомянутого секретного ключа. Это можно сделать, настроив компонент request в конфигурации приложения:
Примечание: Свойство cookieValidationKey является секретным значением и должно быть известно только людям, которым вы доверяете. Не помещайте эту информацию под систему контроля версий.





