Глюк who is online

Главные вкладки

Комментарии

Аватар пользователя Ромка Ромка 30 октября 2008 в 10:42

Кто сказал что это глюк? В блоке выводятся активные сессии. Если один и тот же юзер зашел на сайт с разных компов или с одного компа, но из разных браузеров, то для него будут созданы разные сессии и все они будут выведены в who is online. Так что это не глюк, а фича и исправлять её никто не будет.

Аватар пользователя casualfatboy casualfatboy 30 октября 2008 в 17:32

ага, супер фича, просто отпад,все пользователи балдеют
может подскажите как заставить друпал считать сессии по человечески ?

Аватар пользователя Ромка Ромка 8 ноября 2008 в 21:47

Самый простой способ. Найди файле user.module в функции user_block код:

case 3:
        if (user_access('access content')) {
          // Count users active within the defined period.
          $interval = time() - variable_get('user_block_seconds_online', 900);

          // Perform database queries to gather online user lists.  We use s.timestamp
          // rather than u.access because it is much faster.
          $anonymous_count = sess_count($interval);
          $authenticated_users = db_query('SELECT DISTINCT u.uid, u.name, s.timestamp FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.timestamp >= %d AND s.uid > 0 ORDER BY s.timestamp DESC', $interval);
          $authenticated_count = 0;
          $max_users = variable_get('user_block_max_list_count', 10);
          $items = array();
          while ($account = db_fetch_object($authenticated_users)) {
            if ($max_users > 0) {
              $items[] = $account;
              $max_users--;
            }
            $authenticated_count++;
          }

И замени в нем последний while на:

while ($account = db_fetch_object($authenticated_users)) {
            if ($max_users > 0) {              
              $b = TRUE;
              for($i = 0; $i <= count($items) - 1; $i++) {
                if($items[$i]->uid == $account->uid) $b = FALSE;
              }
              if($b) {
                $items[] = $account;
                $max_users--;
                $authenticated_count++;
              }
            }            
          }

Правда это патч ядра и эти действия придется выполнять после каждого апдейта системы. Чтобы этого избежать, можно скопировать код измененного блока, создать через интерфейс Друпала новый блок, с форматом ввода PHP, и вставить в него скопированный код.

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

Аватар пользователя EllECTRONC EllECTRONC 11 ноября 2008 в 2:14

"Ромка" wrote:
Кто сказал что это глюк? В блоке выводятся активные сессии. Если один и тот же юзер зашел на сайт с разных компов или с одного компа, но из разных браузеров, то для него будут созданы разные сессии и все они будут выведены в who is online. Так что это не глюк, а фича и исправлять её никто не будет.

+ если один и тот же юзер пытался зайти на сайт, но 500 (или еще что... Bad Gateaway) с одной стороны сессия не защитана - доступа к сайту нет. Логинишся еще раз - сессия защитана, но тебя на сайте уже несколько.
(1 юзер * 1 комп * 1 браузер) + 2 попытки = 2 юзера.... как ни крути )))

Аватар пользователя afishi afishi 11 ноября 2008 в 15:51

у меня совсем дургой стоит

case 3:
if (user_access('access content')) {
// Count users active within the defined period.
$interval = time() - variable_get('user_block_seconds_online', 900);

// Perform database queries to gather online user lists. We use s.timestamp
// rather than u.access because it is much faster.
$anonymous_count = sess_count($interval);
$authenticated_users = db_query('SELECT DISTINCT u.uid, u.name, s.timestamp FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.timestamp >= %d AND s.uid > 0 ORDER BY s.timestamp DESC', $interval);
$authenticated_count = db_num_rows($authenticated_users);

// Format the output with proper grammar.
if ($anonymous_count == 1 && $authenticated_count == 1) {
$output = t('There is currently %members and %visitors online.', array('%members' => format_plural($authenticated_count, '1 user', 'count users'), '%visitors' => format_plural($anonymous_count, '1 guest', 'count guests')));
}
else {
$output = t('There are currently %members and %visitors online.', array('%members' => format_plural($authenticated_count, '1 user', 'count users'), '%visitors' => format_plural($anonymous_count, '1 guest', 'count guests')));
}

// Display a list of currently online users.
$max_users = variable_get('user_block_max_list_count', 10);
if ($authenticated_count && $max_users) {
$items = array();

while ($max_users-- && $account = db_fetch_object($authenticated_users)) {
$items[] = $account;
}

$output .= theme('user_list', $items, t('Online users'));
}

$block['subject'] = t('Who\'s online');
$block['content'] = $output;
}
return $block;
}
}
}

......................

Что тут изменить?

Аватар пользователя Ромка Ромка 12 ноября 2008 в 8:49

afishi wrote:
у меня совсем дургой стоит
......................
Что тут изменить?

Этого не может быть. Я для Шестого Друпала пример приводил, у него, вне зависимости от minor версии, ядро одинаковое.

Аватар пользователя afishi afishi 14 ноября 2008 в 3:01

Ромка wrote:
afishi wrote:
у меня совсем дургой стоит
......................
Что тут изменить?

Этого не может быть. Я для Шестого Друпала пример приводил, у него, вне зависимости от minor версии, ядро одинаковое.

а что делать с Пятым?
вы же меня пригласили, там написано 5.х