Как зарегистрировать пользователя из-за неактивности

Чистый, серверный PHP. Каждый раз, когда пользователь отправляет форму, я обновляю время последней активности в базе данных.

Я хочу сделать периодическую проверку и принудительно выйти из неактивных пользователей, чтобы освободить лицензии.

Как мне это сделать? Должен ли я также хранить идентификатор сеанса в базе данных, а затем уничтожать сеанс? Это освободит лицензию для другого пользователя, и когда первая, наконец, представит другую форму, которую я могу проверить в верхней части каждого файла действия формы, если сеанс все еще существует и при необходимости перенаправляет пользователя на страницу входа в систему.

Будет ли это работать? это лучший способ? Любой пример кода?


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

Эта проблема сложнее, чем кажется на первый взгляд.

Вам необходимо рассмотреть поведение сеанса на трех разных уровнях:

  • PHP
  • база данных
  • браузер

PHP

Для PHP вам нужно установить тайм-аут сеанса на то, что вы ограничиваете. Вот пример кода из php.net :

 <?php session_cache_limiter('private'); /* set the cache expire to 30 minutes */ session_cache_expire(30); session_start(); ?> 

База данных

Похоже, вам нужно отслеживать, сколько сеансов активны, чтобы вы могли применить свою лицензию. Поскольку вы находитесь на PHP, вам нужно сделать это на уровне базы данных. Каждый запрос мог написать «последнее время запроса» для пользователя ( UPDATE users SET last_access=NOW() WHERE user_id=? ), А затем вы можете предположить, что активные сеансы являются последними за последние 30 минут.

Вместо «последнего времени доступа» вы можете попытаться отслеживать активные сеансы, снова в базе данных. Я не совсем уверен, как это лучше всего делать на PHP. Я думаю, вы можете вставить в код удаления сеанса PHP. Я считаю, что можно вызвать функцию, когда сеанс истекает, но я этого не делал.

браузер

Можно использовать опрос Javascript, но это не обязательно, если у вас есть тайм-аут на стороне сервера. Рассмотрим случаи, когда пользователь отключает Javascript, или у вас есть ошибка Javascript, которая заставляет скрипт прекратить работу.

У нас очень активный сайт Ajax, поэтому Javascript важен. Тайм-аут может быть обнаружен, когда пользователь делает что-то безвредным, как открывать панель на странице. Я написал свой недавний опыт здесь.

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

 $_SESSION['SessionStartTime'] = time(); 

С каждым запросом пользователя для выполнения какой-либо операции вам необходимо запустить этот скрипт для мониторинга бездействия.

 <?php session_start(); $TimeOutMinutes = 15; // This is your TimeOut period in minutes $LogOff_URL = "login.php"; // If timed out, it will be redirected to this page $TimeOutSeconds = $TimeOutMinutes * 60; // TimeOut in Seconds if (isset($_SESSION['SessionStartTime'])) { $InactiveTime = time() - $_SESSION['SessionStartTime']; if ($InActiveTime >= $TimeOutSeconds) { session_destroy(); header("Location: $LogOff_URL"); } } $_SESSION['SessionStartTime'] = time(); ?> 

Я хочу сделать периодическую проверку и принудительно выйти из неактивных пользователей, чтобы освободить лицензии

Я предполагаю, что вы имели в виду … Когда сессия закончилась (должна быть), вам нужно «сделать что-то», чтобы освободить лицензию, и вы хотите, чтобы она контролировалась на стороне сервера.

session.gc_maxlifetime болит здесь, потому что PHP не отправляет уведомление, когда он разрушает сеанс.

Вам нужно задание cron для сканирования папки сеанса PHP для сеансов, чье время превысило ваш тайм-аут и освободить их лицензию (а также удалить сеанс). Начало для такого скрипта

cd / path / to / sessions; найти -cmin +24 | xargs rm

который был взят со дна http://www.php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime. Вы замените xargs rm чем-то более полезным для вас.

Вы можете сделать это исключительно с помощью JavaScript. Начните таймер обратного отсчета. Затем дождитесь активности и сбросьте этот таймер. Если активности нет, и таймер отключается, вы можете вызвать последовательность выхода из системы.

например :

 <body onmousemove="reset_interval()" onclick="reset_interval()" onkeypress="reset_interval()" onscroll="reset_interval()"> <script type="text/javascript"> function set_interval() { //the interval 'timer' is set as soon as the page loads timer=setInterval("auto_logout()",10000); // the figure '10000' above indicates how many milliseconds the timer be set to. //Eg: to set it to 5 mins, calculate 5min= 5x60=300 sec = 300,000 millisec. So set it to 3000000 } function reset_interval() { //resets the timer. The timer is reset on each of the below events: // 1. mousemove 2. mouseclick 3. key press 4. scroliing //first step: clear the existing timer clearInterval(timer); //second step: implement the timer again timer=setInterval("auto_logout()",10000); ..completed the reset of the timer } function auto_logout() { //this function will redirect the user to the logout script window.location="your_logout_script_location_here"; } </script> 

Надеюсь, это поможет.

PS: Ссылка с: http://www.w3hobbyist.com/web-designing/auto-logout-after-some-time-of-inactivity-with-javascript/

Все эти решения интересны и работают хорошо.

Но: Что делать, если вы находитесь в окне содержимого на основе кадра?

Тогда есть два варианта:

  1. Перед тем, как выйти из системы или вызвать сценарий выхода, необходимо достигнуть верхней части страницы на основе фрейма (может быть сделано с помощью команды JavaScript, «расстраивающей» глубину текущей позиции в кадре)

  2. В качестве альтернативы, сценарий с разделителем кадров или другим сценарием кадра может быть вызван для сброса в верхнюю позицию, например

<style> html{display : none ; } </style>
<script>
if( self == top ) {
document.documentElement.style.display = 'block' ;
} else {
top.location = self.location ;
}
</script>

(co WikiPedia: http://en.wikipedia.org/wiki/Framekiller )

Подробнее о кадровых искателях и кадровых убийцах можно прочитать из разных источников простым поиском в Интернете для «framebuster» или «framekiller».

Вот моя версия, основанная непосредственно на ответе RKh.

Эта версия снова установит таймер, если сеанс еще не истечет. Таким образом, вы можете вставить весь этот блок прямо под свой session_start (), и вам не нужно вызывать его отдельно каждый раз, когда пользователь делает запрос на выполнение действия.

 /* Control Session Timeout */ if (!isset($_SESSION['LastActivity'])) { $_SESSION['LastActivity'] = time(); } //Set Timeout Window in Minutes $TimeOutMinutes = 5; //TimeOut in Seconds $TimeOutSeconds = $TimeOutMinutes * 60; if (isset($_SESSION['LastActivity'])) { $InactiveTime = time() - $_SESSION['LastActivity']; //If Inactive Time more than timeout value log the user out if ($InactiveTime >= $TimeOutSeconds) { session_destroy(); header("Location: $baseURL"); } //If Inactive Time less than timeout reset the last activity to current time elseif ($InactiveTime < $TimeOutSeconds) { $_SESSION['LastActivity'] = time(); } }