Перейти к контенту

Определение статуса онлайн пользователя


Рекомендуемые сообщения

Есть код:

$prefix = "ibf_";
$q=0;
$DB->query("SELECT id, members_display_name AS name, last_activity, ip_address FROM ".$prefix."members

		WHERE id <> 0			
		AND last_activity > UNIX_TIMESTAMP(DATE_FORMAT(SYSDATE(), '%Y-%c-%d 00:00:00'))		  
		ORDER BY last_activity DESC");
while( $row = $DB->fetch_row() ) {
	$idu = $row['id'];
	$last = date('G:i', $row['last_activity']);
	$q++;
	$content.= "
	<tr>
	<td class=\"tdblock\" width=\"80%\">
	$q. <a href=\"$mkportals->forum_url/index.php?showuser=$idu\" onmouseover=\"ajax_showTooltip('index.php?ind=ajax&act=avatar&uid=$idu',this);return false;\" onmouseout=\"ajax_hideTooltip();\">{$row['name']}</a>
	</td>
	<td class=\"tdblock\" width=\"20%\" align=\"left\">$last</td>
	</tr>
";
}
unset($row);
unset($idu);

с помощью данного кода выводим в две колонки тех кто посетил форум с ником и временем посещения (код из блока для CMS MKPortal).

 

Подскажите, пожалуйста, каким образом (запросом) можно определить, кто из пользователей в данном списке находится онлайн?

Изменено пользователем cybermad
Ссылка на комментарий
Поделиться на других сайтах

Канонический вариант: $row['last_activity'] > time() - $this->ipsclass->vars['au_cutoff']*60
Ссылка на комментарий
Поделиться на других сайтах

Ясно, а как правило, чему равно значение: $this->ipsclass->vars['au_cutoff']*60. Основываясь на коде:

 

<setting>
		<conf_id>27</conf_id>
		<conf_title><![CDATA[Период отсутствия активности пользователя (в минутах)]]></conf_title>
		<conf_description></conf_description>
		<conf_group>7</conf_group>
		<conf_type>input</conf_type>
		<conf_key>au_cutoff</conf_key>
		<conf_value></conf_value>
		<conf_default>15</conf_default>
		<conf_extra></conf_extra>
		<conf_evalphp></conf_evalphp>
		<conf_protected>1</conf_protected>
		<conf_position>30</conf_position>
		<conf_start_group></conf_start_group>
		<conf_end_group>0</conf_end_group>
		<conf_add_cache>1</conf_add_cache>
		<conf_title_keyword>cpusaving</conf_title_keyword>
		<conf_is_title>0</conf_is_title>
	</setting>

должно быть 900. Это верно? Т.е. при отсутствии активности пользователя в течение 15 мин. на форуме считается что он не активен? Как быть тогда с проблемой того, что пользователь находится неактивным на форуме более 15 минут но не разлогинивается, а мы считаем его уже отключившимся.... проблема номер два - пользователь разлогинился на форуме, но мы еще 15 минут видим его в списке активных... :D

 

P.S. Может как-то привязаться к ibf_sessions???

Изменено пользователем cybermad
Ссылка на комментарий
Поделиться на других сайтах

должно быть 900. Это верно?

Верно.

 

Как быть тогда с проблемой того, что пользователь находится неактивным на форуме более 15 минут но не разлогинивается, а мы считаем его уже отключившимся

Если пользователь открыл страницу и не уходя с неё читает её час, то никакими разумными методами мы об этом не узнаем. Равно как и если он её читал 5 секунд и закрыл браузер.

 

проблема номер два - пользователь разлогинился на форуме, но мы еще 15 минут видим его в списке активных
Может как-то привязаться к ibf_sessions???

Да. Смотрите запрос как на главной в ./sources/lib/func_boardstats.php

Ссылка на комментарий
Поделиться на других сайтах

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

Гугл-аналитикс и подобные счетчики тоже посчитают новым хостом (посещением) того же юника, если активности не было больше 15 минут.

А если я на ночь забыл закрыть браузер и выключить ноут, а сам спать пошел - это с какого переляку считать активностью?

Активный пользователь - это листающий страницы...

 

 

пользователь разлогинился на форуме, но мы еще 15 минут видим его в списке активных... :D

 

P.S. Может как-то привязаться к ibf_sessions???

Привязка к ibf_sessions ничего не даст.

Насколько я помню, при разлогинивании не происходит удаления строки из таблицы сессий. Очистка происходит, насколько я помню, в функции create_member_session() - т.е. при залогинивании - и удаляеются строки по тому же критерию неактивности свыше заданного времени.

Ссылка на комментарий
Поделиться на других сайтах

Привязка к ibf_sessions ничего не даст.

Насколько я помню, при разлогинивании не происходит удаления строки из таблицы сессий. Очистка происходит, насколько я помню, в функции create_member_session() - т.е. при залогинивании - и удаляеются строки по тому же критерию неактивности свыше заданного времени.

2.3.5:

		$this->ipsclass->DB->simple_construct( array( 'update' => 'sessions',
												  'set'	=> "member_name='',member_id='0',login_type='0',member_group={$this->ipsclass->vars['guest_group']}",
												  'where'  => "id='". $this->ipsclass->sess->session_id ."'"
										 )	  );

Из-за login_type='0' на главной пользователь исчезнет :D

Ссылка на комментарий
Поделиться на других сайтах

Мои извинения.

Заглянул в код, действительно, и в "однушке" при разлогинивании пользователя есть запрос:

		$DB->query("UPDATE ibf_sessions SET ".
				 "member_name='',".
				 "member_id='0',".
				 "login_type='0' ".
				 "WHERE id='". $sess->session_id ."'");

 

Склероз меня подвел... :D

Ссылка на комментарий
Поделиться на других сайтах

У меня тоже бывает такое недоверие в Мэтту :D
Ссылка на комментарий
Поделиться на других сайтах

Модераторам: удалите, пожалуйста этот пост, как потерявший актуальность. Изменено пользователем cybermad
Ссылка на комментарий
Поделиться на других сайтах

Сделал так:

$prefix = "ibf_";
$lonlinelist= $mklib_board->forum_link("onlinelist");
$q=0;
$time = (time() - 900);

$DB->query("SELECT m.id, m.members_display_name AS name, m.last_activity, m.ip_address, s.member_id, s.running_time, s.member_group, g.suffix, g.prefix FROM ".$prefix."members m
	LEFT JOIN ".$prefix."sessions s ON (s.member_id= m.id)
	LEFT JOIN ibf_groups g ON (g.g_id=s.member_group)
	WHERE m.id <> 0			
		AND last_activity > UNIX_TIMESTAMP(DATE_FORMAT(SYSDATE(), '%Y-%c-%d 00:00:00'))		  
		ORDER BY last_activity DESC");

while( $row = $DB->fetch_row() ) {
	$idu = $row['id'];
	$last = date('G:i', $row['last_activity']);
	$q++;

if ( ($row['member_id'] == $row['id']) and ($row['running_time'] > $time))
	{
	$uonline = "{$row['prefix']}{$row['name']}{$row['suffix']}";
	$imgonline = "<img src=\"$mklib->images/online.png\" border=\"0\" alt=\"[online]\" />";
	}
	else
	{
	$uonline = $row['name'];
	$imgonline ="";
	}

если пользователь разлогинивается - срабатывает, если пользователь не активен более 15 минут тоже срабатывает. Также выводится стиль отображения группы для пользователя (подсветка светом).

 

Демо работы блока можно посмотреть здесь (слева второй блок)

Изменено пользователем cybermad
Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.