2012-04-24 4 views
0

Я новичок в PHP и даже новичок в PHP-сессиях, но много читал об этом; однако, я не смог найти ответ на мою проблему. Вот упрощенная версия: 1 - типы пользователей в имени в форме на странице 2 - php-файл получает имя, запускает сеанс и создает на сервере каталог для пользователя с некоторыми настраиваемыми файлами, которые пользователь можно смотреть.Очистка после сеанса PHP

Это вопрос: Поскольку это не настоящий механизм входа в систему, не будет выхода из системы или тайм-аута сеанса, и я не хочу налагать таймаут. До тех пор, пока у него есть страница браузера, каталог, созданный для пользователя на сервере, должен оставаться доступным. Как узнать, когда браузер закрыт, и пользователь больше не использует сеанс, чтобы удалить пользовательский каталог на сервере? Есть ли что-либо, связанное с файлом сеанса, который находится на сервере, который может быть использован: например, если сбор мусора очищает сеанс, и он больше не существует, я мог бы запустить скрипт, чтобы обнаружить это и удалить каталог, связанный с удаленный сеанс.

Что мне не ясно, что происходит с сеансами на сервере, если session_destroy() никогда не вызывается.

ответ

0

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

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

У вас просто нет механизма выхода из системы.

Вы не можете положиться на браузер, чтобы узнать, когда он будет закрыт, оставив и т.д. - он ненадежный и не будет работать. Поэтому - ваше лучшее (и только реальное) решение - проверить серверную часть состояния сеанса. Просто создайте задание CRON, которое запускает php-файл каждые 15 минут или около того. Каждый раз, когда запускается файл php, он проверяет все сеансы за последнее время активности. Если последнее время активности больше, чем ограничение времени ожидания, запустите очистку.

Я знаю, что вы сказали, что не хотите «налагать тайм-аут», но где-то вам придется нарисовать линию на песке и сказать «эй, если мои пользователи неактивны в течение X минут (или даже X часов) - тогда можно с уверенностью предположить, что они ушли и не вернутся! ». Просто установите действительно высокий порог.

+0

Был на полпути, набрав именно такие вещи!Вам просто нужна кнопка «logout», подключенная к функции session_destroy(), которую пользователи могут щелкнуть. –

+0

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

0

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

+0

Таким образом, все эти файлы сеансов находятся на сервере навсегда? _something_ должно случиться с ними! – Rasul

+0

Session_destroy уничтожает эти файлы, я думаю. Я просто говорю, что ничего не происходит с сеансом, просто тайм-аут, который все равно происходит, поэтому ничего не меняется. – DanRedux

1

Как узнать, когда браузер закрыт, и пользователь больше не использует сеанс, чтобы удалить пользовательский каталог на сервере?

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

  • Используйте тело onunload событие, чтобы отправить запрос на сервер, чтобы уничтожить сеанс. Не будет работать все время. Простейший пример, когда пользователь открывает две вкладки и закрывает их.
  • Имейте запрос AJAX, поражающий сервер каждые 3 минуты или около того. Бесполезно в длительных сессиях. Конечно, вы можете настроить «3 минуты» в соответствии с тем, что вы ожидаете в обычной сессии.

Есть любые вопросы, связанные с файла сеанса, который находится на сервере, который может быть использован

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

Что мне не ясно, что происходит с сеансами на сервере, если session_destroy() никогда не вызывается.

Время окончания сеанса. Вы можете 'получить' его с помощью: ini_get("session.gc_maxlifetime");

и установить его с помощью: ini_set ("session.gc_maxlifetime", "3600"); // 3600 в минутах.

+0

Так справедливо предположение, что файл сеанса сидит на сервере, пока кто-то его не удалит, пока не достигнет его maxlifetime, в котором система case gc позаботится об этом? – Rasul

+0

Да, данные сеанса остаются до установленного времени жизни. Обратите внимание, что данные сеанса отличаются от каталогов, которые вы создаете для пользователя. – SuperSaiyan

1

Само определение «при условии, что браузер открыт» очень сложно в HTTP-соединении без состояния.Короче говоря: вы не можете надежно рассказать, как долго открывается окно браузера или когда оно закрыто, просто из-за того, что между браузером и сервером нет постоянной связи. Браузер запрашивает страницу, сервер доставляет ее, соединение закрывается. Страница может или не может быть открыта в браузере, и браузер может или не сможет вернуться к другой странице. Ты просто не знаешь.

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

Выполнение чего-либо еще сложного и имеет недостатки. Например, вы можете включить часть Javascript на страницу, которая время от времени запускает запрос, сообщая серверу, что пользователь все еще там. Это поставит большую нагрузку на сервер, хотя, получая постоянное сердцебиение от многих разных клиентов, когда ничего не происходит.

Другим способом было бы подключиться к событию Javascript beforeunload, которое вы можете использовать для обнаружения, когда пользователь закрывает страницу. Это абсолютно не гарантируется, что вы будете работать все время, но вы не будете получать каждую страницу на сервере по разным причинам. Таким образом, даже в этом случае вам придется отказаться от старых данных в конечном итоге.

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

0

Если я правильно помню, что тайм-аут по умолчанию для сеанса составляет 1440 секунд, значит он истекает автоматически. Если это нормально для вас, то ничего не делайте.

Смежные вопросы