Я создаю сайт сообщества. Пользователи должны войти и выйти, как обычно.
Я использую статус атрибута онлайн / офлайн, чтобы установить статус пользователя. Но что, если пользователь просто нажимает кнопку X или отключается в противном случае без выхода из системы?
В последнее время мой компьютер разбился, когда я открыл сайт с моим ноутбуком, я не мог войти, потому что я не разрешаю вход в два места. Я перехожу к PHPMyAdmin, и я вижу, что мой статус остается в сети. Есть ли какое-либо исправление для этого.
Я пробовал работу last_time activitiy, но это не работает в случае сбоя компьютера! И не было ничего интерактивности или обновления для обновления таблицы.
Вам не нужен флаг онлайн / оффлайн, вам просто нужно сохранить последнее время активации. При отображении статуса пользователя, если последнее время активности меньше, чем сейчас + 15 минут, тогда пользователь находится в режиме онлайн, в противном случае – в автономном режиме.
Из-за характера Интернета вы не можете знать, когда пользователь отключается, дергает кабель или выключает компьютер, не вежливо говоря вам.
Вы можете иметь скрипт (AJAX) каждые 10 минут, чтобы проверить, реагирует ли браузер, а если нет, переключиться в автономный режим – но это потребует дополнительных ресурсов. Вот как работает IRCd: они PING вы, вы PONG назад. Если вы не понг назад, вы переходите к тайм-ауту и отсоединяетесь от сервера.
HTTP не имеет аналогов, другого встроенного решения нет. Возможно, HTML5 и сокеты, но это будет тот же принцип, что и просто AJAX.
Вы можете запускать функцию в каждом запросе страницы, который обновляет строку в вашей базе данных с идентификатором пользователя и рассчитанной временной меткой в будущем (например, time()+(60*5);
– пять минут). Затем, когда другой пользователь пытается проверить, находится ли первый пользователь в сети, вы можете проверить его на базе базы данных с помощью проверки «пульса»:
$time = time(); $query = mysql_query("SELECT user_id, timestamp FROM online_users WHERE user_id = '$user_id' AND timestamp > '$time'");
Если этот запрос возвращает более 0 строк, пользователь считается онлайн.
Далекое решение.
Используйте сервер node.js с socket.io. Попросите клиента подключиться к серверу через клиентскую сторону socket.io. Сервер отвечает за передачу событий клиентам и ожидание ответа. При отключении или позднем ответе отметьте пользователя в автономном режиме.
Он будет работать и, вероятно, будет работать даже при отключении кабеля / закрытии браузера, но стоит ли это усилий?
CREATE TABLE `user_online` ( `session` char(100) NOT NULL default '', `time` int(11) NOT NULL default '0' ) TYPE=MyISAM; <?php session_start(); $session=session_id(); $time=time(); $time_check=$time-600; //SET TIME 10 Minute $host="localhost"; // Host name $username=""; // Mysql username $password=""; // Mysql password $db_name="test"; // Database name $tbl_name="user_online"; // Table name // Connect to server and select databse mysql_connect("$host", "$username", "$password")or die("cannot connect to server"); mysql_select_db("$db_name")or die("cannot select DB"); $sql="SELECT * FROM $tbl_name WHERE session='$session'"; $result=mysql_query($sql); $count=mysql_num_rows($result); if($count=="0"){ $sql1="INSERT INTO $tbl_name(session, time)VALUES('$session', '$time')"; $result1=mysql_query($sql1); } else { "$sql2=UPDATE $tbl_name SET time='$time' WHERE session = '$session'"; $result2=mysql_query($sql2); } $sql3="SELECT * FROM $tbl_name"; $result3=mysql_query($sql3); $count_user_online=mysql_num_rows($result3); echo "User online : $count_user_online "; // if over 10 minute, delete session $sql4="DELETE FROM $tbl_name WHERE time<$time_check"; $result4=mysql_query($sql4); // Open multiple browser page for result // Close connection mysql_close(); ?>
Вы находитесь на правильном пути: сохраните время UNIX последнего действия пользователя в базе данных и, когда кто-то обратится к сайту, установите автономное состояние для пользователей, которые не были активны в течение 15 минут (или меньше). Если пользователь вошел в систему и его статус отключен в базе данных, заставьте его выйти из системы (уничтожая сеанс).
Однако реальный вопрос: стоит ли это? Я еще не видел подобной системы аутентификации.
Я бы использовал комбинацию сеансов тайм-аута, которые не имели активности в последнее время и заканчивали старые сессии, когда была выполнена успешная попытка входа в систему.
Поскольку Konerak упоминал, что HTTP не имеет гражданства, и нет встроенного способа сообщить, покинул ли кто-то ваш сайт . Вы можете понять это с помощью какой-либо методики опроса, основанной на JavaScript, но это вызовет много накладных расходов, которые просто не нужны в большинстве ситуаций.
Вместо этого вы должны отслеживать последний раз, когда была какая-либо деятельность от пользователя, и хранить это время в вашей базе данных или еще лучше, чем что-то вроде memcache . Если время активности последних пользователей больше, чем период ожидания, вы принимаете решение о том, что они больше не находятся на сайте.
Вторая часть будет вместо отказа в регистрации, когда кто-то попытается войти в систему после выхода из сайта без выхода из системы, разрешите им входить в систему и аннулировать какие-либо старые сеансы, связанные с их учетной записью.
подождите, я думаю, у меня есть правильный ответ, потому что я столкнулся с той же проблемой! попробуйте использовать событие мыши [click, movemouse ..], но с задержкой, чтобы не создать сбой в навигаторе, вы будете использовать setInterval в xx sec или минутах после сохранения ответа события на ваш db в столбце активности, но с временем unix, чтобы дифференцировать его позже и теперь. Его полезный действительно, я использовал его для регистрации членов acitvity, чтобы знать, что они действительно делают в реальном времени, и получать онлайн-пользователей в автономном режиме. здесь используются функции js:
var body = document.getElementById('body'); var url = './member-activity.php?loggedUser=<?=$memb_id?>&curl=<?=($_SERVER['QUERY_STRING'])?>'; if(document.addEventListener) { document.addEventListener("click", _EventLogging, false); document.addEventListener("mousemove", _EventLogging, false); }else{ document.attachEvent("onclick", _EventLogging); } function _EventLogging(){ //call it after a delay of setTimeout(AjaxUrl(url), 2000); //delay of 2 sec after every move of cursor } //AjaxUrl is a js function that calls a php file to perform the activity logging via AJAX </script> <div id="id"></div>
div выше, чтобы уведомить вас об ошибках в коде, и удалите его, когда все в порядке! я надеюсь, что мой ответ был правильным для случая ур //dr.alpha@hotmail.co.uk
Ну, реальный ответ на ур вопрос «Как я обновить таблицу без взаимодействия с пользователем?»
является планировщиком событий MySql, вы планируете событие (запрос), которое должно выполняться в любое время, даже если пользователь выключен, читайте об этом здесь ( http://dev.mysql.com/doc/refman/5.1/en/ events-overview.html )
Вы можете использовать этот метод 1. проверить статус пользователя, если он онлайн проверяет последнюю активность, если он имеет статус более 10 минут в автономном режиме, если он меньше 10 минут, пока пользователь не будет доступен онлайн, если он отключен.
Согласно вашему сценарию, вы можете использовать приведенную ниже логику для проверки состояния пользователя:
Вместо того, чтобы проверять, находится ли пользователь в сети или в автономном режиме, только в зависимости от значения столбца таблицы, используйте также переменную сеанса. например, рассмотрите ниже код:
<?php $stauts_from_table_column; if($stauts_from_table_column==1 && isset($_SESSION['userid'])) { $user_logged_in = true; } else { $user_logged_in = false; } ?>
Вы можете улучшить его дальше, но я надеюсь, что на него напомню.