Intereting Posts
Как преобразовать PNG в 8-битный PNG с помощью библиотеки PHP GD PHP array_search последовательно возвращает первый ключ массива Как добавить разрыв строки в echo в PHP? Его результаты неверно отображаются в php / html Как создать пользовательские запросы MySQL в CakePHP? Как перемещаться внутри переменной Как получить сегодняшние / вчера данные из базы данных MySQL? У меня есть таблица SQL. С запросом SQL с PHP я хочу сохранить результат этого запроса в переменной. Как обновлять / вставлять случайные даты в SQL в пределах заданного диапазона дат Гибкий инструментарий: как автоматически перезагрузить сетку Несколько страниц переадресации, которые отображали сообщение раньше, является ли это лучшим методом? Как получить элементы Yox2.0 CheckboxList, проверенные как загружается форма? Недопустимые изображения поддоменов WordPress Multisite, правила перенаправления? Escape Regex Newline Использование слизней в кодеригенере

Сессия заканчивается, даже если я работаю, время сеанса, Ajax и Symfony2

Я настроил приложение для закрытия сеанса по таймауту, если пользователь ничего не делает за 10 минут. В config.yml меня есть:

 session: handler_id: ~ cookie_lifetime: 600 # 10 minutes gc_maxlifetime: 600 # 10 minutes gc_probability: 1 gc_divisor: 1 

Я делаю вызов Ajax каждую минуту, чтобы проверить, будет ли сеанс близок к истечению или нет, и это то, что я проверяю:

 public function isLoggedInAction(Request $request) { $response = array(); $response['authenticated'] = FALSE; $status = 200; $securityContext = $this->container->get('security.context'); if ($securityContext->isGranted('IS_AUTHENTICATED_FULLY')) { $response['authenticated'] = TRUE; } return new JsonResponse($response, $status ?: 200); } 

По какой-то непонятной причине не работает, и каждые 10 минут сеанс закрывается независимо от того, работаю ли я со страницей или нет, почему? Я что-то упустил?

Редактировать 1 Пробовал новые значения, все еще не работает:

 session: handler_id: ~ cookie_lifetime: 1800 gc_maxlifetime: 600 gc_probability: 1 gc_divisor: 100 

Пока я работал на странице, выполняя вызовы Ajax и некоторые другие задачи, сеанс был закрыт, поэтому он не работает. Единственное значение, которое, по- видимому, работает для меня до сих пор, установлено cookie_lifetime: 86400 #1 day который сумасшедший для меня!

Редактировать 2 После предложения @acontell для исправления времени и даты VM я пытаюсь использовать эти новые значения (10 минут занимает слишком много времени, поэтому я изменился на 3):

 session: handler_id: ~ cookie_lifetime: 1800 gc_maxlifetime: 180 # session will expire after 3 minutes of inactivity gc_probability: 1 gc_divisor: 100 

Кроме того, я установил дату / время на виртуальной ntpd включив службу ntpd и теперь дата прекрасна:

 [root@webvm var]# date Sun Feb 1 18:35:17 VET 2015 

Но через 5 минут (вызов функции был выполнен 5 раз) сессия все еще жива. Вот как я вызываю функцию isLoggedInAction() со стороны JavaScript:

 $.post(Routing.generate('isLoggedIn',{}),{},'json').done(function (data, textStatus, jqXHR){ if( data.authenticated ){ var timer = window.setInterval(function(){ $.post(Routing.generate('isLoggedIn',{}),{},'json').done(function (data, textStatus, jqXHR){ if( !data.authenticated ){ window.clearInterval(timer); $.growl({ message: 'La sesión ha expirado por inactividad, debe <a href=""><b>iniciar seción</b></a> nuevamente.' }, { type: "danger", allow_dismiss: false, timer: 10000, animate: { enter: 'animated fadeInDown', exit: 'animated fadeOutUp' }, onHide: function(){ location.reload(); } }); } }).fail(function(){}); },60000); } }).fail(function(){}); работают $.post(Routing.generate('isLoggedIn',{}),{},'json').done(function (data, textStatus, jqXHR){ if( data.authenticated ){ var timer = window.setInterval(function(){ $.post(Routing.generate('isLoggedIn',{}),{},'json').done(function (data, textStatus, jqXHR){ if( !data.authenticated ){ window.clearInterval(timer); $.growl({ message: 'La sesión ha expirado por inactividad, debe <a href=""><b>iniciar seción</b></a> nuevamente.' }, { type: "danger", allow_dismiss: false, timer: 10000, animate: { enter: 'animated fadeInDown', exit: 'animated fadeOutUp' }, onHide: function(){ location.reload(); } }); } }).fail(function(){}); },60000); } }).fail(function(){}); 

См. Изображение ниже:

введите описание изображения здесь

Тест 3

После того, как все было хорошо работает, я сделал последнее и окончательное испытание: откройте приложение и оставайтесь нетронутым всю ночь (почти 8 часов) и удивите его, чтобы он не закрывал сессию. Как показано ниже, посмотрите, сколько запросов запрашивает страница и как работает сеанс, почему?

введите описание изображения здесь

Аякс звонит каждый раз: 10,5 минут

 $.post(Routing.generate('isLoggedIn',{}),{},'json').done(function (data, textStatus, jqXHR){ if( data.authenticated ){ var timer = window.setInterval(function(){ $.post(Routing.generate('isLoggedIn',{}),{},'json').done(function (data, textStatus, jqXHR){ if( !data.authenticated ){ window.clearInterval(timer); $.growl({ message: 'La sesión ha expirado por inactividad, debe <a href=""><b>iniciar seción</b></a> nuevamente.' }, { type: "danger", allow_dismiss: false, timer: 10000, animate: { enter: 'animated fadeInDown', exit: 'animated fadeOutUp' }, onHide: function(){ location.reload(); } }); } }).fail(function(){}); }, 210000); } }).fail(function(){}); работают $.post(Routing.generate('isLoggedIn',{}),{},'json').done(function (data, textStatus, jqXHR){ if( data.authenticated ){ var timer = window.setInterval(function(){ $.post(Routing.generate('isLoggedIn',{}),{},'json').done(function (data, textStatus, jqXHR){ if( !data.authenticated ){ window.clearInterval(timer); $.growl({ message: 'La sesión ha expirado por inactividad, debe <a href=""><b>iniciar seción</b></a> nuevamente.' }, { type: "danger", allow_dismiss: false, timer: 10000, animate: { enter: 'animated fadeInDown', exit: 'animated fadeOutUp' }, onHide: function(){ location.reload(); } }); } }).fail(function(){}); }, 210000); } }).fail(function(){}); 

Настройки говорят, что сеанс должен быть продлен: 10 минут.

 session: handler_id: ~ cookie_lifetime: 630000 gc_maxlifetime: 630000 # session will expire after 10 minutes of inactivity gc_probability: 1 gc_divisor: 100 

Время на сервере в порядке:

 [root@webvm sencamer.dev]# date Mon Feb 2 07:26:53 VET 2015 

Что еще я должен проверить?

Тест 5

Хорошо, я все еще делаю тест, потому что это плохое поведение. Итак, это то, что я сделал для этого теста:

  • Откройте приложение и начните работать с ним.
  • В какой-то момент перестаньте работать и оставьте заявку, вызвав вызов Ajax, чтобы проверить, жив ли сеанс или нет. (сеанс еще жив, см. рисунок ниже)
  • После этого первого вызова я продолжаю работать над приложением, как показано на рисунке 2, но конец сеанса сюрпризов заканчивается, и приложение приближается.

Зачем? Что вызывает такое поведение? Правильно ли это по моим параметрам?

Это изображение показывает первый и единственный вызов функции

введите описание изображения здесь

После того, как звонок был сделан, я продолжаю работать, но сеанс закрывается

введите описание изображения здесь

Во-первых, gc_probability внимание на gc_probability и gc_divisor . Если оба параметра равны единице, это означает, что вероятность запуска процесса сборщика мусора (GC) при каждой инициализации сеанса равна gc_probability / gc_divisor = 1/1 = 1 (100%).

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

Например:

 session: # handler_id set to null will use default session handler from php.ini handler_id: ~ cookie_lifetime: 600 # Ten minutes gc_probability: 1 gc_divisor: 10000 

Кроме того, если вы используете виртуальную машину, проверьте дату своего сервера, итоговый файл cookie сеанса будет time() + cookie_lifetime временем истечения time() + cookie_lifetime где время берется с сервера.

Возможно, что, если у сервера была плохая дата, cookie истечет немедленно. Представьте себе: дата сервера 2015-01-31 , ваш браузер 2015-02-01 . Сервер отправляет cookie, срок действия которого истекает в 2015-01-31 в 11:00, ваш браузер получает файл cookie с уже прошедшей датой истечения срока действия.

попробуйте с этими параметрами:

 gc_probability: 0 gc_divisor : 1000