Как сохранить сеанс без перезагрузки страницы?
У меня странная проблема в моей онлайн-системе управления тестированием.
Некоторым пользователям тестовой формы (test.php) требуется долгое время для ответа на вопрос и отправки формы.
После отправки формы сеанс истек, и пользователь должен снова войти в систему
это не проблема кода
Я устанавливаю это значение в начало всех страниц
ini_set('session.gc_maxlifetime', 18000);
Есть ли способ обновить сеанс evrey за 10 минут без перезагрузки страницы в тестовой форме, чтобы предотвратить истечение срока действия сеанса?
Пожалуйста, помогите мне
Спасибо
Ответы
Ответ 1
Вы можете использовать javascript XHR, или, как другие называют его, AJAX.
С помощью ajax вы можете вызвать php script, который обновляет вашу сессию каждые 10 минут.:)
Это насколько я могу перейти к "точной".
Javascript
var refreshSn = function ()
{
var time = 600000; // 10 mins
settimeout(
function ()
{
$.ajax({
url: 'refresh_session.php',
cache: false,
complete: function () {refreshSn();}
});
},
time
);
};
refresh_session.php
<?php
session_start();
// store session data
if (isset($_SESSION['id']))
$_SESSION['id'] = $_SESSION['id']; // or if you have any algo.
?>
В любом случае, другим решением будет продлить время сеанса для тестовой страницы, только используя
представленное здесь решение
Как закончить сеанс PHP через 30 минут?
Ответ 2
Все, что вам нужно, это (использует jQuery для $.post):
JavaScript (поместите это внутри своей функции onload или что-то в этом роде)
setInterval(function(){$.post('path/to/refresh_session.php');},600000); //refreshes the session every 10 minutes
refresh_session.php
<?php
session_start();
if (isset($_SESSION['token'])) { //if you have more session-vars that are needed for login, also check if they are set and refresh them as well
$_SESSION['token'] = $_SESSION['token'];
}
?>
(Я знаю, что это почти то же самое, что и принятый ответ, я действительно хотел прокомментировать этот, но у меня пока нет достаточной репутации.
Самое большое изменение в JavaScript, вам не нужна целая функция, всего одна строка.)
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
Хотя я думаю, что достаточно просто вызвать session_start()
в php, если я прочитаю это право (http://nl3.php.net/function.session-start):
Обратный вызов будет извлекать любые существующие данные сеанса (хранится в специальный сериализованный формат) и будет неэтериализован и использоваться для автоматически заполняйте суперкоммуляцию $_SESSION при чтении обратный вызов возвращает сохраненные данные сеанса обратно в обработку сеанса PHP.
И во время тестирования я помещаю вышеуказанный код только на мою страницу посетителя, а не на страницу администратора. Но у меня открылись обе страницы в том же браузере (Chrome), и страница администратора осталась вошедшей в систему, по крайней мере, более часа (больше не проверялась).
НО, я не знаю, работает ли он, если вы используете только session_start()
, без ручного обновления любого сеанса-var вообще.
В любом случае, мне нравится быть уверенным в том, что необходимые мне сеансовые вазы по-прежнему существуют:)