Как очистить сессии php ? | PHPClub
nukri
Новичок
- #1
Как очистить сессии php ?
Добрый день.
Прошу помощи по следующему вопросу:
На своем сайте я использую систему postnuke 0.750
+ MySQL 4.1.11
При большой нагрузке (больше юзеров) у меня возникли локальные проблемы
с сессиями:
И првадйер мне написал следующий ответ:
1. IPOWWEB has one specific detail in its setup for php session handling: the session cleanup mechanism is disabled. Holding session records in the database rather than in a file may give you a cleanup problem, you need to schedule the cleanup by cronjob yourself.
Перевод: У провайдера есть одна специфическая установка для сессий php — механизм очистки сессий отключен. Сохранение сессий в базе данных, а не в файле дает проблемы их очистки. У нас есть механизм автозапуска прложений на сервере (cronjob) который можно использовать для очистки сессий на основе файлов.
2. You may want to switch the configuration options accordingly. As mitchind mentioned, use a session subdirectory in your own account webspace, customize your own copy of php.ini, then add the cleaup cronjob.
Кажется так: Вы можете изменить свою конфигурацию, использовать для сессий директорию и очищать ее при помощи cronjob.
Я понимаю что информация дана в трудноваримом формате … но прошу мне помочь со следующим вопросом: что это за сессии php и где они находятся ? (не postnuke)
Спасибо.
Фанат
oncle terrible
- #2
что это за сессии php и где они находятся
Нажмите для раскрытия. ..
в базе данных
nukri
Новичок
- #3
Спасибо …
А как она хоть выглядит эта таблица ?
Фанат
oncle terrible
- #4
ээээ.
это ты у меня спрашиваешь?
я никгда не работал с postnuke 0.750
nukri
Новичок
- #5
Для postnuke таблица «nuke_session» сессий мне известна. И ее чистка не спасает ситуацию.
Я интересуюсь есть ли что-то «еще» от php что надо может быть связано с фразой «the session cleanup mechanism is disabled»
baev
‹°°¬•
- #6
nukri
1.
2. Её и надо чистить: отправлять периодически cron’ом запрос на её очистку (DELETE FROM …). Можно удалять не все записи, а по условию. Например, те, у которых lastused меньше «сегодня».
nukri
Новичок
Но зачем ее удалять ? В чем причина ? Что будет если записи хранятся не 1 день, а 20 дней ?
Я ее очищал вручную но ошибка все равно сохранялась.
baev
‹°°¬•
- #8
Мне, например, фраза про «локальные проблемы с сессиями» совершенно непонятна…
nukri
Новичок
А текст ошибки у postnuke простой:
Переодически с частотой 2-3 раза в день возникает и сама пропадает ошибка «Session initialisation failed»
Длительность ошибки от нескольких минут до 1 часа — 2-х
Она появляется если бродить по сайту … после нескольких рефрешов страницы сайт опять доступен … и так в течении вышенаписанного времени …
От провайдера пока добился ответа который написан выше.
physh
поедатель запятых
- #10
OFFTOP — вот по-моему явный пример приемущества собственно-ручно сделанного велосипеда над наштамповкой.
ЗЫ: что-то мне подсказывает что тут дело не просто в sql таблице…
nukri
Новичок
- #11
physh — вот именно . ..
Мое ощущение (ламера), что это может быть результатом ограничения (хостером) количества запросов к SQL серверу.
#13 Сессии во Flask ~ Уроки по Flask ~ PythonRu
Сессии — еще один способ хранить данные конкретных пользователей между запросами. Они работают по похожему на куки принципу. Для использования сессии нужно сперва настроить секретный ключ. Объект session
из пакета flask
используется для настройки и получения данных сессии. Объект session
работает как словарь, но он также может отслеживать изменения.
При использовании сессий данные хранятся в браузере как куки. Куки, используемые для хранения данных сессии — это куки сессии. Тем не менее в отличие от обычных куки Flask криптографически отмечает куки сессии. Это значит, что каждый может видеть содержимое куки, но не может их менять, не имея секретного ключа для подписи. Как только куки сессии настроены, каждый последующий запрос к серверу подтверждает подлинность куки с помощью такого же секретного ключа. Если Flask не удается это сделать, тогда его контент отклоняется, а браузер получает новые куки сессии.
Знакомые с сессиями из языка PHP заметят, что сессии во Flask немного отличаются. В PHP куки сессии не хранят данные о сессии, а только id сессии. Это уникальная строка, которую PHP создает для ассоциации данных сессии с куки. Данные сессии хранятся на сервере в виде файла. При получении запроса от пользователя PHP использует id сессии, чтобы найти данные сессии и отобразить их в коде. Такой тип сессий известен как серверный, а те, которые используются во Flask, называется клиентскими.
По умолчанию различий между куки и клиентскими сессиями во Flask не так много. В итоге клиентские сессии страдают от тех же недостатков, что и обычные куки:
- Не могут хранить конфиденциальную информацию, такую как пароли.
- Дают лишнюю нагрузку при каждом запросе.
- Не способны хранить больше 4 КБ.
- Ограничены в общем количестве куки для одного сайта
и так далее.
Единственное реальное различие между куки и клиентскими сессиями — Flask гарантирует, что содержимое куки сессии не может быть изменено пользователям (только если у него нет секретного ключа).
Для использования клиентских сессий во Flask можно или написать собственный интерфейс сессии или использовать расширения, такие как Flask-Session или Flask-KVSession.
Как читать, записывать и удалять данные сессии
main2.py
, чтобы добавить следующий код после функции представления article()
:from flask import Flask, render_template, request, redirect, url_for, flash, make_response, session #... @app.route('/visits-counter/') def visits(): if 'visits' in session: session['visits'] = session.get('visits') + 1 # чтение и обновление данных сессии else: session['visits'] = 1 # настройка данных сессии return "Total visits: {}".format(session. get('visits')) @app.route('/delete-visits/') def delete_visits(): session.pop('visits', None) # удаление данных о посещениях return 'Visits deleted' #...
Стоит обратить внимание, что объект session
используется как обычный словарь. Если сервер не запущен, нужно его запустить и зайти на https://localhost:5000/visits-counter/
. На странице будет счетчик посещений:
Чтобы увеличить его, нужно несколько раз обновить страницу.
Flask отправляет куки сессии клиенту только при создании новой сессии или изменении существующей. При первом посещении https://localhost:5000/visits-counter/
будет исполнено тело else
в функции представления visits()
, в результате чего будет создана новая сессия. При создании новой сессии Flask отправит куки сессии клиенту. Последующие запросы к https://localhost:5000/visits-counter
приведут к исполнению кода в блоке if
, в котором обновляется значение счетчика visits
сессии. При изменении сессии будет создан новый файл куки, поэтому Flask отправит новые куки сессии клиенту.
Чтобы удалить данные сессии нужно зайти на https://localhost:5000/delete-visits/
.
Если сейчас открыть https://localhost:5000/visits-counter
, счетчик посещений снова будет показывать 1.
По умолчанию куки сессии существуют до тех пор, пока не закроется браузер. Чтобы продлить жизнь куки сессии, нужно установить значение True
для атрибута permanent
объекта session
. Когда значение permanent
равно True
, срок куки сессии будет равен permanent_session_lifetime
. permanent_session_lifetime
— это атрибут datetime.timedelta
объекта Flask
. Его значение по умолчанию равно 31 дню. Изменить его можно, выбрав новое значение для атрибута permanent_session_lifetime
, используя ключ настройки PERMANENT_SESSION_LIFETIME
.
import datetime app = Flask(__name__) app.permanent_session_lifetime = datetime.timedelta(days=365) # app.config['PERMANENT_SESSION_LIFETIME'] = datetime.timedelta(days=365)
Как и request
, объект sessions
доступен в шаблонах.
Изменение данных сессии
Примечание: перед тем как следовать инструкции, нужно удалить куки, установленные локальным хостом.
Большую часть времени объект session
автоматически подхватывает изменения. Но бывают случаи, например изменение структуры изменяемых данных, которые не подхватываются автоматически. Для таких ситуаций нужно установить значение True
для атрибута modified
объекта session
. Если этого не сделать, Flask не будет отправлять обновленные куки клиенту. Следующий код показывает, как использовать атрибут modified
объекта session
. Откроем файл main2.py
, чтобы добавить следующий код перед функцией представления delete_visitis()
.
#... @app.route('/session/') def updating_session(): res = str(session.items()) cart_item = {'pineapples': '10', 'apples': '20', 'mangoes': '30'} if 'cart_item' in session: session['cart_item']['pineapples'] = '100' session.modified = True else: session['cart_item'] = cart_item return res #...
При первом посещении https://localhost:5000/session/
код в блоке else
будет исполнен. Он создаст новую сессию, где данные сессии будут в виде словаря. Последующий запрос к https://localhost:5000/session/
обновляет данные сессии, установив количество «ананасов» на значении 100. В следующей строке атрибут modified
получает значение True
, потому что без него Flask не будет отправлять обновленные куки сессии клиенту.
Если сервер не запущен, его следует запустить и зайти на https://localhost:5000/session/
. Отобразится пустой словарь session
, потому что у браузера еще нет куки сессии, которые он мог бы отправить серверу:
Если страницу перезагрузить, в словаре session
будет уже «10 ананасов»:
Перезагрузив страницу в третий раз, можно увидеть, что словарь session
имеет значение «ананасов» равное 100, а не 10:
Объект сессии подхватил изменение благодаря атрибуту modified
. Удостовериться в этом можно, удалив куки сессии и закомментировав строку, где для атрибута modified
устанавливается значение True
. Теперь после первого запроса значение словаря сессии будет равно «10 ананасам».
Это все, что нужно знать о сессиях во Flask. И важно не забывать, что по умолчанию сессии во Flask являются клиентскими.
- ТЕГИ
- Flask
- Уроки по Flask на русском
Максим
Я создал этот блог в 2018 году, чтобы распространять полезные учебные материалы, документации и уроки на русском. На сайте опубликовано множество статей по основам python и библиотекам, уроков для начинающих и примеров написания программ.
Python Q https://yandex.ru/q/loves/python Online
Python QCEO [email protected]://secure.gravatar.com/avatar/b16f253879f7349f64830c64d1da4415?s=96&d=mm&r=gCEO PythonruPythonАлександрРедакторhttps://t.me/cashncarryhttps://pythonru.com/https://yandex.ru/q/profile/cashnc/PythonRu. [email protected] Zabrodin2018-10-26OnlinePython, Programming, HTML, CSS, JavaScriptДействительно уничтожить все сеансы PHP на сервере
У меня есть веб-приложение PHP, работающее на сервере Linux. Доступ к нему осуществляется через браузер.
Он использует сеансы PHP для хранения состояния входа и идентификатора пользователя. Мне нужно разлогинить всех пользователей.
У меня есть root-доступ, и я пытаюсь уничтожить все сеансы PHP, заставляя всех пользователей снова войти в систему.
Я удалил все файлы sess_XXX, хранящиеся в /tmp/, и когда я возвращаюсь в веб-приложение, я все еще вхожу в систему, и файл сеанса воссоздается в /tmp/, и все мои данные остаются нетронутыми — с использованием тех же значений как ранее предполагалось, что данные сеанса все еще где-то хранятся.
Насколько мне известно, не существует «механизма кэширования», кроме файлов сеанса PHP, кэширующих данные пользователя.
Я пытался изменить имя сеанса PHP, а затем удалить файлы сеанса, но я все еще вошел в систему. Проверка файлов sess_XXX показывает идентичную информацию даже после удаления файла сеанса, а затем воссоздания путем повторного посещения приложения в веб-браузер. Эта информация не хранится в браузере пользователя, поэтому она должна быть извлечена из сеанса.
Кто-нибудь знает, как я могу действительно уничтожить сеансы и заставить пользователей выйти из системы?
- php
- сессия
4
Мы столкнулись с той же проблемой и решили создать страницу обслуживания. Поскольку код проверяет, что пользователь вошел в систему, мы создали код в процессе проверки входа, который проверяет, включен ли режим обслуживания, заставляя всех пользователей снова входить в систему.
Мы рискуем иметь пользователей, которые в этот момент простаивают. В этих случаях мы использовали информацию, хранящуюся в файле cookie сеанса, принудительно закрывая сеанс для всех пользователей с отметкой времени, предшествующей тому, в котором режим обслуживания. Вместо метки времени вы можете использовать любые пользовательские данные, которые хранятся в файле cookie (группа пользователей, роль пользователя, идентификатор пользователя), чтобы быть более точными и сфокусироваться на определенном диапазоне пользователей.
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie
.Могут ли сеансы работать без файлов cookie?
Могут ли сеансы работать без файлов cookie? Если да, то как сеанс работает без файлов cookie, включенных в PHP?
Это отличный вопрос для собеседования, потому что даже если вы не знаете ответа, вы можете придумать довольно точный ответ самостоятельно, обладая некоторыми базовыми знаниями о сеансах PHP и некоторым аналитическим мышлением. Посмотрите, можете ли вы представить себе, как сеансы PHP будут работать без включенных файлов cookie в браузере.
Ответ на вопрос, как сеансы PHP могут работать без файлов cookie
Сессии в PHP обычно используют файлы cookie для работы. Но сеансы PHP также могут работать без файлов cookie в случае, если файлы cookie отключены или отклонены браузером, с которым сервер PHP пытается установить связь.
Как сеансы PHP работают без файлов cookie
PHP делает две вещи, чтобы работать без файлов cookie:
1. Для каждой HTML-формы, которую PHP находит в вашем HTML-коде (которая, конечно, может быть частью файла PHP), PHP автоматически добавит скрытый тег ввода с именем PHPSESSID сразу после тега