У меня есть дыра в моем сценарии входа в систему и я действительно не знаю, как ее заполнить.
Вся проблема появилась, когда пользователи начали просто покидать страницу, а не выходить из системы. На самом деле ничего плохого в этом не было бы, потому что в моем коде есть выход из системы через 15 минут (время ожидания сеанса), но в моей базе данных есть столбец «онлайн», который изменяется при входе и выходе из системы, поэтому, когда пользователь просто закройте страницу, она не изменится на оффлайн.
Я пытался window.onbeforeunload, чтобы перейти на страницу, где выход (не работает)
Я также слышал о Cron, но я совершенно не знаю, как это сделать.
Может кто-нибудь сказать мне, как решить мою проблему с подробным объяснением?
С нетерпением жду Вашего ответа.
Решением может быть то, что каждый раз, когда страница загружается, или, возможно, ajax-запрос для каждой страницы, чтобы отослать код на сервер, чтобы сказать «эй, этот пользователь онлайн», а затем иметь встроенную функцию для ваших сценариев (которые работают на любая страница, которую кто-либо просматривает), чтобы проверить, находится ли время обновления mysql в течение последних X минут, и если нет, предполагается, что пользователь вышел из системы.
Я думаю, что объяснил это довольно плохо.
В вашей таблице есть поле метки времени, связанное с каждым пользователем, вошедшим в систему, и они считаются подключенными, если последнее обновление метки времени произошло в течение X минут от СЕЙЧАС,
Таким образом, каждый раз, когда страница загружается или каждый раз, когда обрабатывается ajax-вызов, поле timstamp обновляется, а затем в любом поле, которое имеет метку времени старше X минут, это потому, что они (вероятно) вышли из системы и поэтому они в БД изменяются на «автономные». Хотя, если они просто заняты и все еще в сети, возможно, на самом деле не выходите из системы, просто пометьте их как офлайн.
Я работаю без подробностей о том, как вы обрабатываете информацию о содержимом вашей базы данных и т. Д., Так что моя идея может быть лучше из того, что вы можете создать -?
РЕДАКТИРОВАТЬ:
Ajax Предложение
Чтобы ajax действовал на каждой странице каждые X секунд, напишите следующий ajax на страницу, на которой находится участник, помните, что число в конце составляет миллисекунды, 600000 = 10 минут. Так что использовал 500000, так как это в пределах временного интервала. поэтому функция ajax запускается каждые 8,5 минут или при загрузке страницы.
Аякс довольно плохо написан и, вероятно, может быть улучшен. Но должно работать. Вам нужно будет изучить более оптимальный сценарий AJAX.
СТРАНИЦА БРАУЗЕРА:
<script src="js/jquery-1.11.1.min.js" type="text/javascript" ></script>
<script type="text/javascript">
$( document ).ready(function() {
var memberId = <?php print $memberId; ?>;
var securityKey = <?php print some security key code or suchlike to validate this ajax at the otherend;?>;
setInterval(function(){
$.post("/ajaxSession.php",{
MemberId: memberId,
somesecuritykey: securityKey
});
}, 500000);
});
</script>
AJAX PAGE:
Обратите внимание, что время обновления в этом случае является полем MySQL для отметки времени.
<?php
/**
Setup this page as if any other PHP page but this page will never show to the browser,
AJAX data is supplied as $_POST and inn this case $_POST['somesecuritykey'] and $_POST['MemberId']
**/
session_start();
/**
include classes and files
**/
if (is_numeric($_POST['MemberId'])){
$memid= (int)$_POST['MemberId'];
/**Also include your security stuff here **/
$sql = "UPDATE Members SET UpdateTime = NOW() , LoggedIn = 'YES' WHERE MemberId = ? LIMIT 1"$mysqli = new mysqli();
$mysqli->prepare($sql);
$mysqli->bind_param("i",$memid);
$mysqli->execute();
}
И это должно поддерживать значения меток времени в актуальном состоянии, поэтому вошедшими в систему людьми могут быть все, у кого UpdateTime больше, чем time () — 601 (10:01 минут), листинги SQL могут изменить это в любом заголовке / классе, что происходит, когда кто-либо получает доступ к любой странице.
SQL = "UPDATE Members SET LoggedIn = 'NO' WHERE UpdateTime < (NOW() - INTERVAL 10 MINUTE)"
Других решений пока нет …