Запускать функцию по истечении сеанса?

#php

#php

Вопрос:

Возможно ли запустить функцию по окончании сеанса в PHP-скрипте? Мой скрипт задает несколько вопросов, и у пользователя есть 30 минут, чтобы ответить, или сеанс истекает. Я хотел бы, чтобы мой скрипт сохранял любой прогресс в текстовом файле, если сеанс истекает, а пользователь не выполнил все ответы. Как бы я это сделал?

Я слышал о register_shutdown_function (‘завершение работы’); но я не понимаю, где я должен вызывать ее в своем скрипте.

Мой текущий скрипт начинается так:

  ini_set('session.gc_maxlifetime',1800);
 ini_set('session.gc_probability',1);
 ini_set('session.gc_divisor',1);
 session_start();
 if($_SESSION['loggedin'] !== 1) {//checks to see if user has logged in
 header('Location: login.php');
 exit;}

 ...asks a bunch of questions....
 session_destroy();
  

Спасибо за вашу помощь.

Ответ №1:

На самом деле у вас есть два варианта:

  1. Сохраняйте прогресс, когда это происходит (после каждого ответа), и сохраняйте информацию о том, был ли он завершен. Это решение работает, даже если браузер был закрыт (прогресс сохраняется в режиме реального времени).

  2. Используйте AJAX для вызова сервера каждые, например, 5 секунд, и сервер должен возвращать информацию о том, закончился сеанс или нет. Если сеанс закончился, то делайте в JS то, что вам нужно (даже перенаправляйте на другую страницу). Это решение не гарантирует сохранение прогресса (браузер может быть закрыт до выполнения действия).

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

Если страница перезагружается после каждого ответа (например, перезагружается для отображения следующего вопроса), то вы можете использовать вариант № 1. Если все вопросы находятся на одной странице, выберите вариант №. 2. Если ваше приложение представляет собой комбинацию этих двух, вы можете выбрать оба варианта.

Редактировать:

Судя по вашему коду, вы смешиваете:

  • сессия с точки зрения времени для ответов на вопросы с
  • сессия с точки зрения хранения значений между запросами к странице в PHP.

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

Ответ №2:

Есть пара методов, которые сразу приходят на ум. Вы могли бы использовать встроенный в PHP метод sleep или вы могли бы использовать AJAX. Не говорю, что это единственные способы, просто первые, которые приходят на ум.

Редактировать: Теперь, когда я думаю об этом, переход в режим ожидания, вероятно, не вариант, поскольку это превысило бы максимальное время выполнения и выдало бы ошибку. Не тестировал, чтобы убедиться, но кажется логичным. Итак, AJAX — ваш лучший выбор, предполагая, что я ничего не упускаю.

Комментарии:

1. Вы правы, что sleep() здесь не вариант. Возможно, вы используете Comet (AJAX long polling) вместо традиционного AJAX, но это будет лишь крошечной частью более масштабного решения под названием long-polling.