Запретить сеанс истек в сеансе PHP для неактивного пользователя

У меня проблема с моим приложением: в моем приложении много форм, и для завершения этой формы требуется около 1 часа, потому что форма является динамической (можно добавлять другие формы). Проблема в том, что сеанс моего веб-сервера составляет 24 минуты. Когда пользователь заполняет форму, он тратит так много времени, и время ожидания сеанса истекло, потому что сервер распознал, что пользователь неактивен. Когда форма отправлена, это очень раздражает, большая часть данных была потеряна, и пользователь возвращается на страницу входа. Я попытался истечь срок моего сеанса через 10 часов с помощью этого кода:

ini_set('session.gc_maxlifetime', '36000');

Но он не работает на моем сервере, возможно ли, что мой сервер препятствует работе ini_set()?

Итак, что мне делать для решения этой проблемы? Могу ли я предотвратить тайм-аут сеанса, чтобы его можно было увеличить до 10 часов? Или можно отключить истечение срока сеанса?

Спасибо


person dian    schedule 11.05.2011    source источник
comment
Вы можете реализовать свою собственную систему сеансов на основе файлов cookie и баз данных или файлов.   -  person jcubic    schedule 11.05.2011
comment
Пожалуйста, выберите один из ответов в качестве ответа в своей беседе.   -  person cbroughton    schedule 12.05.2011
comment
@jcubic - ›да, сэр, я реализовал куки. поэтому, если сеанс истек, файлы cookie по-прежнему сохраняют данные входа в систему, но когда пользователь отправляет форму, страница перенаправляется на стартовую страницу (страницу, на которую мы сначала смотрим при успешном входе в систему). маршрут перенаправления form page (when submit, session expired) -> login page (if cookies true) -> starting page, поэтому данные потеряны   -  person dian    schedule 13.05.2011
comment
Я имею в виду, не используйте $ _SESSION (session_start), используйте файлы cookie и сохраняйте свои переменные в базе данных или файлах. Когда пользователь входит в систему, создайте токен и сохраните его в cookie и сохраните свои переменные на основе этого токена.   -  person jcubic    schedule 14.05.2011


Ответы (5)


Вместо того, чтобы устанавливать фиксированное время в ini, напомните, что тайм-аут сеанса сбрасывается при перезагрузке. Итак, создайте некоторый код ajax, который каждые 5 минут или около того отправляет запрос к файлу (изображению или чему-то еще). Таким образом, таймер сбрасывается каждые 5 минут, и пользователи могут потратить день на заполнение ваших форм.

person Prikkeldraad    schedule 11.05.2011
comment
Не могу поверить, что одно из лучших решений этой проблемы до сих пор получило 0 голосов - просто увеличение времени жизни сеанса должно быть худшим решением - это огромный риск для безопасности, и я никогда не видел веб-приложение где каждый вариант использования должен иметь бизнес-логику длительного сеанса ... поэтому сделайте несколько вызовов ajax для варианта использования, который в этом нуждается, и оставьте время ожидания сеанса нетронутые на стороне сервера! чудаки ... - person jebbie; 13.02.2013
comment
Не могли бы вы привести пример кода? У меня нет опыта работы с ajax. - person Adam; 23.08.2014
comment
Вот пример: stackoverflow.com/questions/12597176/ - person ujash joshi; 05.12.2016
comment
так что же теперь Chrome приостанавливает фоновые вкладки? - person sivann; 23.05.2018

Вот пример предотвращения тайм-аута сеанса с помощью вызова jQuery Ajax:

var refreshTime = 600000; // every 10 minutes in milliseconds
window.setInterval( function() {
    $.ajax({
        cache: false,
        type: "GET",
        url: "refreshSession.php",
        success: function(data) {
        }
    });
}, refreshTime );

в refreshSession.php вы можете сделать что-то вроде session_start ()

person MDeuerlein    schedule 25.02.2015
comment
лучший ответ, instagram и facebook используют этот метод - person webmaster; 06.03.2015
comment
Это хороший ответ, но я не понимаю совета делать session_start для этого скрипта, поскольку, например, в моем случае session_start уже произошел. Не мог бы кто-нибудь прояснить мне этот момент, пожалуйста? - person manou; 25.07.2016
comment
На этом нет сценария сеанса. Это javascript, который заставляет пользователя загружать что-то с вашего сервера. (refreshSesson.php). Код представляет собой Javascript и, похоже, использует jQuery. Пользователь (в данном случае вызов ajax), попавший на вашу страницу обновления, перезапустит ваш сеанс, если у вас есть session_start в вашем файле refreshSession.php. - person Dave; 29.07.2016

У меня была такая же проблема в прошлом. Чтобы обойти это, я поместил эти две функции в файл конфигурации, который включается в каждый файл.

session_set_cookie_params(86400);
ini_set('session.gc_maxlifetime', 86400);

и на всякий случай измерьте эту строку в моем файле .htaccess

php_value session.gc_maxlifetime 86400
person ChazUK    schedule 11.05.2011
comment
Имею: session.cookie_lifetime = 200000; session.gc_maxlifetime = 600000. Однако это не помогает, и данные иногда теряются при отправке формы. Есть мысли, пожалуйста? - person Andre Polykanine; 11.09.2016

Изменение session.gc_maxlifetime с помощью ini_set должно работать, если вы измените параметр перед вызовом session_start. Таким образом, следующее должно сработать:

ini_set('session.gc_maxlifetime', 36000);
session_start();

Вы также можете изменить этот параметр в других контекстах (см. Ответ ЧазУК).

Но я бы не установил фиксированное значение времени жизни файла cookie, а сделал бы файл cookie сеанса реальным файлом cookie сеанса, который длится до завершения сеанса браузера (т. е. до закрытия браузера). Вы можете сделать это, установив для session.cookie_lifetime значение 0.

Также учтите, что модель истечения срока сеанса PHP немного странно, поскольку расчет времени жизни основан на дате последнего изменения данных сеанса.

person Gumbo    schedule 11.05.2011
comment
Я пробовал использовать ini_set('session.gc_maxlifetime', 36000); до session_start();, но он не работает на моем сервере. Я игнорирую свой Интернет более чем через 24 минуты, и когда я его обновляю, он перенаправляется на страницу входа. Возможно ли, что мой сервер препятствует функции ini_set ()? или что? Спасибо, сэр - person dian; 13.05.2011
comment
Хорошо, я вижу, есть ли разница между ini_set('session.gc_maxlifetime', '36000'); и ini_set ('session.gc_maxlifetime', 36000); сэр ? см. номер в одинарной кавычке :) - person dian; 13.05.2011
comment
Я использую одинарную кавычку в номере: D - person dian; 13.05.2011
comment
@dian: Нет, использование кавычек в данном случае не имеет значения. Но вы проверяли, совпадает ли идентификатор сеанса? - person Gumbo; 13.05.2011

Срок действия файла cookie сеанса устанавливается при создании файла cookie сеанса. Если вы используете метод setcookie, аргументом метода является ДЛИНА, в течение которой вы хотите, чтобы cookie сохранялся.

Дополнительную информацию см. В руководстве PHP по этому методу: http://php.net/manual/en/function.setcookie.php

person cbroughton    schedule 11.05.2011