Перейти к содержимому


× Быстрый вопрос
Пользователь месяца
Андрей WPM Андрей WPM 1-й за Июль
Очков активности: 2 142 4 темы, 90 сообщений, 14 баллов репутации
Сайт: wpmaster.kz
ТОП самых активных за этот месяц
  • Фотография Rodiola
    #1

    Rodiola (rukodelkovo.ru)
    Очков активности: 310.5 1 тема, 66 сообщений, 3 балла репутации

  • Фотография maxnik
    #2

    maxnik (konovalovpavel.ru)
    Очков активности: 126 0 тем, 21 сообщение, 4 балла репутации

  • Фотография Андрей WPM
    #3

    Андрей WPM (wpmaster.kz)
    Очков активности: 103.5 Вне конкурса за определение пользователя месяца

  • Фотография annabum
    #4

    annabum
    Очков активности: 75 2 темы, 19 сообщений, 2 балла репутации

  • Фотография IxMaster
    #5

    IxMaster (site.ru)
    Очков активности: 60 2 темы, 14 сообщений, 2 балла репутации

  • Фотография Vmir
    #6

    Vmir
    Очков активности: 54 Вне конкурса за определение пользователя месяца

  • Фотография Megoydagi
    #7

    Megoydagi (24ho.ru)
    Очков активности: 43.5 5 тем, 14 сообщений, 1 балл репутации

  • Фотография lena220678
    #8

    lena220678
    Очков активности: 28.5 2 темы, 13 сообщений, 1 балл репутации

  • Фотография re-search
    #9

    re-search
    Очков активности: 24 4 темы, 4 сообщения, 1 балл репутации

  • Фотография BLIK
    #10

    BLIK
    Очков активности: 24 0 тем, 16 сообщений, 1 балл репутации

  • Показать весь ТОП 10
Поддержите форум! =)
Апдейты
  • Яндекс ИКС: 30.07.2019
  • Яндекс выдача: 19.08.2019
Топ 5 участников по репутации


  • Закрытая тема Тема закрыта

Как определить онлайн ли пользователь?

#1 gaaarfild

gaaarfild
  • Неактивные
  • 596 сообщений
  • Репутация: 0
0

Отправлено 21 Апрель 2010 - 22:52

Как определять, онлайн ли пользователь?

 

 

  • 0

#2 Matt

Matt
  • Неактивные
  • 774 сообщений
  • Репутация: 2

Отправлено 22 Апрель 2010 - 00:54

Какой, где?
  • 0

#3 gaaarfild

gaaarfild
    Topic Starter
  • Неактивные
  • 596 сообщений
  • Репутация: 0

Отправлено 22 Апрель 2010 - 15:00

Ну мы о чем сейчас говорим?
О PHP. Как, средствами PHP определять онлайн ли сейчас пользователь. Где - неважно.
  • 0

#4 ZiTosS

ZiTosS
  • Неактивные
  • 5 148 сообщений
  • Репутация: 8

Отправлено 22 Апрель 2010 - 20:45

gaaarfild,
Да проще простого, система должна быть построена так, чтобы можно было при обращении к любой странице изменять данные в БД, о текущем состоянии пользователя...
Тогда всё просто, при каждом обращении к скрипту пользователем, у нас в текущей сессии или ещё где хранится id_user. И есть у нас таблица, последнего активного сеанса пользователей.
Данные в эту таблицу заносятся или обновляются при каждом обращении авторизованного пользователя к страницам ресурса. Обязательно должно быть поля даты-времени последнего обращения.

Теперь нужно определиться, как удалять устаревшие записи:
1) При каждом обращении любого пользователя к страницам ресурса. Но это накладно, очень накладно. Хотя сначала стоило бы проверить наличие таких устаревших записей. Тогда нагрузка будет меньше.
2) Запустить скрипт в планировщике задач к примеру каждые 3 минуты или каждые 5 минут.
3) Иметь запись где-либо, о дате последнего обновления списка действий. И при каждом обращении пользователя проверять устарела ли эта дата или нет. Если устарела, список надо почистить.

Решать какой вариант выбрать, или придумать какой-либо ещё, дело разработчика.
И так, для определения, кто у нас онлайн нам надо:
1) Иметь данные о последних действиях пользователей. Это может быть файл или таблица БД. (С файлами выйдут накладки)
2) Информационная часть, которая будет запрашивать данные из таблицы с последними действиями и по ID юзера в ней и выводить ник
3) Обработчик, удаляющий старые записи о действиях, которые были произведены более чем N времени ранее
  • 0

#5 gaaarfild

gaaarfild
    Topic Starter
  • Неактивные
  • 596 сообщений
  • Репутация: 0

Отправлено 22 Апрель 2010 - 22:24

А планировщик - это CRON? И как с ним работать? Он ведь не везде так просто работает.
  • 0

#6 ZiTosS

ZiTosS
  • Неактивные
  • 5 148 сообщений
  • Репутация: 8

Отправлено 22 Апрель 2010 - 22:48

gaaarfild, CRON это только под *nix, под Windows существуют аналоги.
Вообще ставить подобные задания на планировщик не советую, он работает независимо от вашего скрипта. Это висячий демон, который запускает в нужные моменты скрипты на сервере. Теперь представим, что он повис... Думаю, ясно что будет.
Как настраивать и управлять CRON'ом под Linux:
Настройка crontab ( источник 1 | источник 2 )
  • 0

#7 gaaarfild

gaaarfild
    Topic Starter
  • Неактивные
  • 596 сообщений
  • Репутация: 0

Отправлено 23 Апрель 2010 - 09:44

Тогда, мне кажется, наиболее подходящий вариант - 3.
Спасибо. Если ни у кого больше нет дополнительных вопросов, то тему можно закрыть, я думаю.
  • 0

#8 ZiTosS

ZiTosS
  • Неактивные
  • 5 148 сообщений
  • Репутация: 8

Отправлено 23 Апрель 2010 - 11:12

gaaarfild, как по мне, то тоже, но хранить файл не очень приятно, бывают конфликты в доступе. Может есть вариант получше, но у меня что-то в голову ничего не лезет.
  • 0

#9 gaaarfild

gaaarfild
    Topic Starter
  • Неактивные
  • 596 сообщений
  • Репутация: 0

Отправлено 23 Апрель 2010 - 15:41

Зачем файл. В поле БД у каждого пользователя поле last_access и поле online(int).
И проверять все это.
  • 0

#10 ZiTosS

ZiTosS
  • Неактивные
  • 5 148 сообщений
  • Репутация: 8

Отправлено 23 Апрель 2010 - 16:04

gaaarfild, Имелось ввиду, что имеется запись последней чистки данных, чтобы каждый раз не проверять и не чистить при каждом обращении - это большая нагрузка. Вот эту запись я предлагал хранить в файле.
  • 0

#11 gaaarfild

gaaarfild
    Topic Starter
  • Неактивные
  • 596 сообщений
  • Репутация: 0

Отправлено 23 Апрель 2010 - 16:17

А их и необязательно чистить. Мы берем данное last_access и сравниваем его с нынешним временем. если оно отличается больше чем надо, тогда нет в онлайне. Вообще отлично. Значит даже поле online ненужно. =)
  • 0

#12 gaaarfild

gaaarfild
    Topic Starter
  • Неактивные
  • 596 сообщений
  • Репутация: 0

Отправлено 28 Апрель 2010 - 14:28

И время лучше хранить в формате Unix_time. Так гораздо удобнее сравнивать.
  • 0

#13 gaaarfild

gaaarfild
    Topic Starter
  • Неактивные
  • 596 сообщений
  • Репутация: 0

Отправлено 01 Май 2010 - 01:36

И тут же возник попутный вопрос. Как можно еще общее время пребывания сохранять. Например человек был в онлайне столько-то часом, минут, дней, лет. =)
  • 0

#14 reaboom

reaboom
  • Неактивные
  • 40 сообщений
  • Репутация: 0

Отправлено 01 Май 2010 - 08:05

Предположим, что пользователь считается активным в течении 10-ти минут после последнего обновления страницы.
Вытаскиваем из БД время последнего обновления, находим разность текущего времени и времени последнего обновления. Если данная разность больше 10 минут, то прибавляем к общему пребыванию времени 10 минут, если меньше, то прибавляем эту разность.


  • 0

#15 ZiTosS

ZiTosS
  • Неактивные
  • 5 148 сообщений
  • Репутация: 8

Отправлено 01 Май 2010 - 09:05

gaaarfild, в общем, нужно будет создать ещё одно поле. А таблица должна хранить не последнюю активность, а сессии. То есть должна быть одна запись, для одной сессии.
И всё же я настоятельно не советую при каждом обращении пользователя чистить данную табличку, изменять в ней данные. Лучше, как я уже сказал, должно это происходить один раз через каждые N минут, к примеру.
  • 0

#16 gaaarfild

gaaarfild
    Topic Starter
  • Неактивные
  • 596 сообщений
  • Репутация: 0

Отправлено 01 Май 2010 - 09:27

Ну я сделал онлайн просто с полем Last_Access в котором хранится unixtime. Далее просто при обращении к каждой странице он запускает скрипт, который обновляет это поле. А выводит онлайн, проверяя, отличается ли это время более чем на 5 минут. Если меньше, то человек считается онлайн и соответственно выводится в список.

А как считать время сессии??
  • 0

#17 reaboom

reaboom
  • Неактивные
  • 40 сообщений
  • Репутация: 0

Отправлено 01 Май 2010 - 09:55

Допустим есть таблица (можете переделать ее на свой вкус):
CREATE TABLE sessions
(
id INT NOT NULL AUTO_INCREMENT,
session_id TEXT NOT NULL,
last_time INT NOT NULL,
all_time INT NOT NULL DEFAULT 0,
PRIMARY KEY (id)
);

где session_id - идентификатор сессии, last_time - время последнего обращения пользователя к сайту, all_time - общее время проведенное на сайте.

Ниже приведен пример, который выводит все идентификаторы сессий (и сколько всего времени под этой сессией проведено пользователем), пользователи которых, сейчас онлайн:
<?php
// Включаем сессию
session_start();

// Текущее время
$current_time = time();

// Подключаемся к MySQL
mysql_connect('localhost', 'root', '12345');
mysql_select_db('test');

// Выбираем пользователя с такой-же ID-сессий, как сейчас
$res = mysql_query("SELECT * FROM sessions WHERE session_id = '". session_id() ."'");

// Если такого пользователя не существует, то нужно создать его
if (!mysql_num_rows($res)) {
mysql_query("INSERT INTO sessions (session_id, last_time, all_time) VALUES('". session_id() ."', '". $current_time ."', '0')");
}
else {
$row = mysql_fetch_array($res);

$all_time = $row['all_time'];

// *** Обновляем общее проведенное время на сайте ***
// Если последнее обновление пользователя было более 5 минут назад, добавляем к общему приведенному времени 5 минут
if ($current_time - $row['last_time'] > 300) {
$all_time += 300;
}
else { // Иначе добавляем разность
$all_time += $current_time - $row['last_time'];
}

// Обновляем таблицу
mysql_query("UPDATE sessions SET last_time = '". $current_time ."', all_time = '". $all_time ."' WHERE session_id = '". session_id() ."'");
}

// Выводим все активные сессии
$res = mysql_query("SELECT * FROM sessions WHERE last_time > '". ($current_time - 300) ."'");
while ($row = mysql_fetch_array($res)) {
print $row['session_id'] .' - '. $row['all_time'] .' seconds<br />';
}
?>


Если на сайте есть регистрация, не нужно отслеживать пользователей онлайн по сессии, просто в таблице пользователей добавьте два поля (last_time и all_time) и вместо идентификатора сессии используйте идентификатор пользователя. Так-же это предпочтительней, потому что не придется каждый раз, очищать таблицу хранящую идентификаторы сессии.
  • 0

#18 gaaarfild

gaaarfild
    Topic Starter
  • Неактивные
  • 596 сообщений
  • Репутация: 0

Отправлено 01 Май 2010 - 12:42

Большое спасибо
  • 0

#19 FordogeN

FordogeN
  • Неактивные
  • 1 414 сообщений
  • Репутация: 0

Отправлено 01 Май 2010 - 20:41

Я реализовал так:
Есть таблица для лога посещений и если пользователь авторизован - туда так же записывается его логин... кроме логина записывается время и дата.

Вот мой код
function online($user_login){
$online_q=mysql_query("SELECT dated, datem, dateY, datem, dateH, datei FROM stat WHERE user LIKE '".strtolower($user_login)."' ORDER BY id DESC");
$online_arr=mysql_fetch_array($online_q);
if($online_arr['dated']==date(d) AND $online_arr['datem']==date(m) AND $online_arr['dateY']==date(Y) AND $online_arr['dateH']==date(H)){
$datei=date(i);
$datei1=$datei-1;
$datei2=$datei-2;
$datei3=$datei-3;
if($online_arr['datei']==$datei OR $online_arr['datei']==$datei1 OR $online_arr['datei']==$datei2 OR $online_arr['datei']==$datei3){
echo "<span style='padding: 2px; color: #7bb800; font-size: 10px;'> Онлайн </span><br>";
}else{
$last_vizit=$online_arr['dateH'].":".$online_arr['datei']." ".$online_arr['dated'].".".$online_arr['datem'].".".$online_arr['dateY'];
echo "<span style='color: gray; padding: 2px; font-size: 9px;'>(Последний визит: $last_vizit)</span>";
}
}else{
$last_vizit=$online_arr['dateH'].":".$online_arr['datei']." ".$online_arr['dated'].".".$online_arr['datem'].".".$online_arr['dateY'];
echo "<span style='color: gray; padding: 2px; font-size: 9px;'>(Последний визит: $last_vizit)</span>";
}
}



Вызов функции
echo online(логин);


Вот пример использования функции http://shotbox.ru/ma...p?user=fordogen
  • 0

Как настроить выдержку и диафрагму зеркального фотоаппарата



#20 gaaarfild

gaaarfild
    Topic Starter
  • Неактивные
  • 596 сообщений
  • Репутация: 0

Отправлено 02 Май 2010 - 00:27

При вызове функции, Echo - лишнее. =)
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Похожие темы

  Название темы Автор Статистика Последнее сообщение

Оформление форума – IPBSkins.ru