Casual
Освоившийся
Дата регистрации:
13.10.2012 17:58:28
Сообщений: 20
Часто нужно знать статус конкретного пользователя - залогинен он или нет. В социальных сетях показывают кто из друзей онлайн, в чатах есть список присутствующих.
Как это реализовать?
Я создал отдельную таблицу в которую добавляю запись с id пользователя, когда он авторизуется и, соответственно, удаляю эту запись, когда он жмет на кнопку Выход.
Однако здесь есть одна проблема. Если пользователь просто уходит со страницы\закрывает браузер, то запись в таблице все равно остается и считается, что он на сайте. Следующий шанс обновить его статус у нас появиться, когда он снова зайдет на сайт.
Я решил обойти эту проблему следующим образом. В таблицу, где содержаться записи о пользователях в онлайне я добавил поле с информацией о времени последнего обновления.
Когда пользователь логиниться, то я пишу в это поле значение функции time (). Далее обновляю страницу каждые 10 секунд с помощью javascript. При каждом таком обновлении я, во-первых, обновляю время для этого пользователя делая его равным текущему значению time, а во-вторых прохожу по всем остальным записям в этой таблице и удаляю те из них, которые не обновлялись более 60 секунд.
Таким образом, если какой-то пользователь закрыл страницу сайта более чем на 60 секунд, то он удаляется из списка "в онлайне".
Этот метод работает, но смущает цена, которую приходится платить - каждый посетитель бомбардирует сервер запросами.
Можно ли решить задачу более изящно?
Admin
Администратор
Дата регистрации:
27.05.2010 21:23:42
Сообщений: 3063
Вот самый классический вариант реализации "Кто онлайн": http://myrusakov.ru/php-who-online.html
Casual
Освоившийся
Дата регистрации:
13.10.2012 17:58:28
Сообщений: 20
В статье описан тот же метод, что я и предложил выше. Разница лишь в том, что в статье обновление таблицы происходит, когда кто-либо из пользователей совершает какое-либо действие(кликает по ссылке и т.п.), а я решил повесить обновление на таймер, чтобы даже тот человек, который просто открыл страницу и не на что не нажимает, видел бы как люди приходят и уходят в реальном времени.
Admin
Администратор
Дата регистрации:
27.05.2010 21:23:42
Сообщений: 3063
Ваш способ вполне рабочий, но вот постоянное обновление страницы может повергнуть в шок многих пользователей. Такие вещи делаются через Ajax, либо через обычную отправку POST-запросов через JavaScript, чтобы не было обновления страницы.
Casual
Освоившийся
Дата регистрации:
13.10.2012 17:58:28
Сообщений: 20
Через Ajax я и собирался делать. Про обновление страницы это я для простоты. Смущает большое кол-во бесполезных и регулярных запросов к серверу со стороны каждого клиента.
А что значит "обычную отправку POST-запросов через JavaScript, чтобы не было обновления страницы"?
Admin
Администратор
Дата регистрации:
27.05.2010 21:23:42
Сообщений: 3063
Ajax - это громоздкая библиотека, подключать которую имеет смысл, если сайт вовсю её будет использовать. А если только для одного скрипта, то гораздо разумнее делать вот так: http://myrusakov.ru/javascript-post.html
Default
Эксперт
Дата регистрации:
12.06.2012 15:20:27
Сообщений: 102
Casual
Освоившийся
Дата регистрации:
13.10.2012 17:58:28
Сообщений: 20
Честно говоря, я думал, что отправка запросов с помощью объекта XMLHttpRequest, как написано в этой статье http://myrusakov.ru/javascript-post.html - это и есть Ajax.
По поводу приведенного php-кода. Не понятно почему это будет работать без средств js. Кода этот скрипт должен запускаться? Все равно каждый пользователь должен будет постоянно обращаться к серверу, чтобы получить свежий список тех, кто онлайн, а сделать это можно только через js.
Default
Эксперт
Дата регистрации:
12.06.2012 15:20:27
Сообщений: 102
при каждом обновлении страницы идет выборка из базы пользователей со статусом онлайн, и и его время последнего обращение к скрипту, потом проверка идет, если текущее время больше последнего обращения + (определенные минуты, которые вы хотите определять пользователя в он лайне), то в поле этого пользователя заносим оффлайн
mischa.samolkaev
Продвинутый
Дата регистрации:
12.07.2012 13:00:02
Сообщений: 74
Возможно моя идея нестандартна, но можно реализовать другим способом:
В файле клиента(допустим 'user_file'+id), инкрементируется значение количества вкладок с открытым сайтом, а при отсоединении, счетчик декрементируется, возможный код код такой (примерно)
----------------------------------------------------
file function.php
<?php
function userIncKlNmb(){
$usrFile='user_file_'+$_SESSION['USER_ID'];
if(!file_exists($usrFile))file_put_contents($usrFile,'0');
else {
$content=file_get_contents($usrFile);
file_put_contents($usrFile,(string)($content++));
}
}
function userDecKlNmb(){
$usrFile='user_file_'+$_SESSION['USER_ID'];
if(file_get_contents($usrFile)=='0')unlink($usrFile);
else {
$content=file_get_contents($usrFile);
file_put_contents($usrFile,(string)($content--));
}
}
?>
Любой скрипт с соединением клиента с сервером
<?php
session_start();
include_once('function.php');
userIncKlNmb():
register_shutdown_function('userDecKlNmb');
/*
Много кода
*/
?>
Страница с пользовательскими онлайнами
<?php
/*Анализом файлов получаем ассоциативный массив id=>значение
*/
foreach($array as $key=>$value){
if($value<1)echo "Пользователь $key офлайн";
else echo "Пользователь $key онлайн"
}
?>