<MyRusakov.ru />

Разработчик игр на Unreal Engine

Разработчик игр на Unreal Engine

Этот комплект с нуля всего за 7 месяцев сделает Вас Unreal-разработчиком. И при этом учиться достаточно 1 час в день.

Начнёте Вы с основ программирования, постепенно перейдя к C++. Затем очень подробно изучите Unreal Engine, и после научитесь программировать на C++ в Unreal Engine. В конце создадите крупный проект на C++ в Unreal Engine для своего портфолио.

Комплект содержит:

- 416 видеоуроков

- 95 часов видео

- 1024 задания для закрепления материала из уроков

- 3 финальных тестирования

- 4 сертификата

- 12 Бонусных курсов

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Форум сайта MyRusakov.ru

Проверка онлайн-статуса
01.11.2012 18:50:10 Проверка онлайн-статуса Сообщение #1
Casual

Casual

Освоившийся

Освоившийся

Дата регистрации:
13.10.2012 17:58:28

Сообщений: 20

Часто нужно знать статус конкретного пользователя - залогинен он или нет. В социальных сетях показывают кто из друзей онлайн, в чатах есть список присутствующих.
Как это реализовать?

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

Однако здесь есть одна проблема. Если пользователь просто уходит со страницы\закрывает браузер, то запись в таблице все равно остается и считается, что он на сайте. Следующий шанс обновить его статус у нас появиться, когда он снова зайдет на сайт.

Я решил обойти эту проблему следующим образом. В таблицу, где содержаться записи о пользователях в онлайне я добавил поле с информацией о времени последнего обновления.

Когда пользователь логиниться, то я пишу в это поле значение функции time (). Далее обновляю страницу каждые 10 секунд с помощью javascript. При каждом таком обновлении я, во-первых, обновляю время для этого пользователя делая его равным текущему значению time, а во-вторых прохожу по всем остальным записям в этой таблице и удаляю те из них, которые не обновлялись более 60 секунд.

Таким образом, если какой-то пользователь закрыл страницу сайта более чем на 60 секунд, то он удаляется из списка "в онлайне".

Этот метод работает, но смущает цена, которую приходится платить - каждый посетитель бомбардирует сервер запросами.

Можно ли решить задачу более изящно?
Профиль
01.11.2012 19:10:38 Проверка онлайн-статуса Сообщение #2
Admin

Admin

Администратор

Администратор

Дата регистрации:
27.05.2010 21:23:42

Сообщений: 3063

Вот самый классический вариант реализации "Кто онлайн": http://myrusakov.ru/php-who-online.html
Профиль
01.11.2012 20:33:20 Проверка онлайн-статуса Сообщение #3
Casual

Casual

Освоившийся

Освоившийся

Дата регистрации:
13.10.2012 17:58:28

Сообщений: 20

В статье описан тот же метод, что я и предложил выше. Разница лишь в том, что в статье обновление таблицы происходит, когда кто-либо из пользователей совершает какое-либо действие(кликает по ссылке и т.п.), а я решил повесить обновление на таймер, чтобы даже тот человек, который просто открыл страницу и не на что не нажимает, видел бы как люди приходят и уходят в реальном времени.
Профиль
01.11.2012 20:45:01 Проверка онлайн-статуса Сообщение #4
Admin

Admin

Администратор

Администратор

Дата регистрации:
27.05.2010 21:23:42

Сообщений: 3063

Ваш способ вполне рабочий, но вот постоянное обновление страницы может повергнуть в шок многих пользователей. Такие вещи делаются через Ajax, либо через обычную отправку POST-запросов через JavaScript, чтобы не было обновления страницы.
Профиль
02.11.2012 12:43:57 Проверка онлайн-статуса Сообщение #5
Casual

Casual

Освоившийся

Освоившийся

Дата регистрации:
13.10.2012 17:58:28

Сообщений: 20

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

А что значит "обычную отправку POST-запросов через JavaScript, чтобы не было обновления страницы"?
Профиль
02.11.2012 14:01:40 Проверка онлайн-статуса Сообщение #6
Admin

Admin

Администратор

Администратор

Дата регистрации:
27.05.2010 21:23:42

Сообщений: 3063

Ajax - это громоздкая библиотека, подключать которую имеет смысл, если сайт вовсю её будет использовать. А если только для одного скрипта, то гораздо разумнее делать вот так: http://myrusakov.ru/javascript-post.html
Профиль
05.11.2012 13:14:48 Проверка онлайн-статуса Сообщение #7
Default

Default

Эксперт

Эксперт

Дата регистрации:
12.06.2012 15:20:27

Сообщений: 102

не самый лучший вариант, но есть с чего оттолкнутся без средств js

$time = time();
$query = mysql_query("UPDATE users SET online='1', update_list=$time WHERE id_user=$id_user AND login='$login'";
$query_2 = mysql_query("SELECT login, update_list FROM users WHERE online = '1'";
while($result = mysql_fetch_array($query_2)){
$last_visit = $result['update_list'] + 60;
if(time() >= $last_visit){
$login_user = $result['login'];
$query = mysql_query("UPDATE users SET online='0', update_list=$last_visit WHERE login='$login_user'";

}
}
Профиль
06.11.2012 12:35:38 Проверка онлайн-статуса Сообщение #8
Casual

Casual

Освоившийся

Освоившийся

Дата регистрации:
13.10.2012 17:58:28

Сообщений: 20

Честно говоря, я думал, что отправка запросов с помощью объекта XMLHttpRequest, как написано в этой статье http://myrusakov.ru/javascript-post.html - это и есть Ajax.

По поводу приведенного php-кода. Не понятно почему это будет работать без средств js. Кода этот скрипт должен запускаться? Все равно каждый пользователь должен будет постоянно обращаться к серверу, чтобы получить свежий список тех, кто онлайн, а сделать это можно только через js.
Профиль
07.11.2012 05:10:52 Проверка онлайн-статуса Сообщение #9
Default

Default

Эксперт

Эксперт

Дата регистрации:
12.06.2012 15:20:27

Сообщений: 102

при каждом обновлении страницы идет выборка из базы пользователей со статусом онлайн, и и его время последнего обращение к скрипту, потом проверка идет, если текущее время больше последнего обращения + (определенные минуты, которые вы хотите определять пользователя в он лайне), то в поле этого пользователя заносим оффлайн
Профиль
07.11.2012 19:08:03 Проверка онлайн-статуса Сообщение #10
mischa.samolkaev

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 онлайн"
}
?>
Профиль