У меня странная проблема в моей онлайн-системе управления тестированием.
Некоторым пользователям тестовой формы (test.php) требуется долгое время для ответа на вопрос и отправки формы.
После отправки формы сеанс истек, и пользователь должен снова войти в систему
это не проблема кода
Я установил это значение в верхней части всех страниц
ini_set('session.gc_maxlifetime', 18000);
Есть ли способ обновить сеанс evrey 10 минут без перезагрузки страницы в тестовой форме, чтобы предотвратить истечение срока действия сеанса?
пожалуйста, помогите мне
благодаря
Вы можете использовать javascript XHR, или, как его называют другие, AJAX.
Используя ajax, вы можете вызвать скрипт php, который обновляет сеанс каждые 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 минут?
Все, что вам нужно, это (использует 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 вообще.
В любом случае, мне нравится быть уверенным, что сеанс-вары, которые мне нужны, действительно все еще есть 🙂