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

Сервис обмена электронных валют

Выбрать шаблон и создать сайт

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

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

#11 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0
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