Зарегистрируйте функцию для запуска в PHP, когда сеансы уничтожены - PullRequest
1 голос
/ 29 июля 2010

Я бы хотел, чтобы функция запускалась всякий раз, когда сеанс уничтожается. Я рассмотрел использование session_set_save_handler, но я не хочу вручную обрабатывать хранилище сессий, я просто хочу немного обработать, когда они уничтожены. Есть ли способ сделать это без использования session_set_save_handler?

Ответы [ 5 ]

1 голос
/ 29 июля 2010

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

0 голосов
/ 30 июля 2010

Это легко сделать на других языках с полной платформой приложений, таких как Java, .NET и т. Д. Например, у вас есть события, которые запускаются сервером при запуске, запуске приложения, завершении сеанса и т. Д. С помощью PHPне существует реальной концепции «приложения» в том же смысле, что и в других языках, поэтому у вас нет тех событий, которые запускаются сервером приложений.Но есть вещи, которые вы можете сделать вручную.

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

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

0 голосов
/ 29 июля 2010

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

Но на самом деле это работа сборщика мусора. И весь session_set_save_handler не так сложен в использовании. Вы можете установить готовый и просто запускать свою функцию при вызове сборщика мусора.

0 голосов
/ 29 июля 2010

Единственный способ, как я вижу, - отказаться от обработки мусора и сделать это самостоятельно.Не будет работать для сеансов на основе memcached, но файловые сессии легко прослеживаются / загружаются / удаляются (просто ищите файлы, к которым недавно не обращались в каталоге сеанса).

0 голосов
/ 29 июля 2010

Вы можете сделать это с помощью register_shutdown_function () .Функция выполняется при выходе из скрипта.

Редактировать : Поскольку мой ответ выше был неверным, я редактирую, чтобы дать лучший ответ.Вы можете вызывать любую понравившуюся вам функцию до или после вызова session_destroy().Сеанс стирается только при явном вызове session_destroy().Обратите внимание, что PHP также очищает сеансы с истекшим сроком в задании cron, если оно задано системным администратором, но у вас нет возможности повлиять на эту очистку из сценария php.

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