Кто сказал что это глюк? В блоке выводятся активные сессии. Если один и тот же юзер зашел на сайт с разных компов или с одного компа, но из разных браузеров, то для него будут созданы разные сессии и все они будут выведены в who is online. Так что это не глюк, а фича и исправлять её никто не будет.
Самый простой способ. Найди файле user.module в функции user_block код:
case3: 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++; }
Правда это патч ядра и эти действия придется выполнять после каждого апдейта системы. Чтобы этого избежать, можно скопировать код измененного блока, создать через интерфейс Друпала новый блок, с форматом ввода PHP, и вставить в него скопированный код.
Ну вообще, это все извращения, лично мне удобнее видеть список активных сессий, а не юзеров. Как минимум можно убедиться не увели ли у кого-нибудь акк.
Кто сказал что это глюк? В блоке выводятся активные сессии. Если один и тот же юзер зашел на сайт с разных компов или с одного компа, но из разных браузеров, то для него будут созданы разные сессии и все они будут выведены в who is online. Так что это не глюк, а фича и исправлять её никто не будет.
+ если один и тот же юзер пытался зайти на сайт, но 500 (или еще что... Bad Gateaway) с одной стороны сессия не защитана - доступа к сайту нет. Логинишся еще раз - сессия защитана, но тебя на сайте уже несколько.
(1 юзер * 1 комп * 1 браузер) + 2 попытки = 2 юзера.... как ни крути )))
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();
Комментарии
Пока что никак. Даже тут есть такое. А поскольку глюк некритичный, то и исправлять его никто не спешит.
Кто сказал что это глюк? В блоке выводятся активные сессии. Если один и тот же юзер зашел на сайт с разных компов или с одного компа, но из разных браузеров, то для него будут созданы разные сессии и все они будут выведены в who is online. Так что это не глюк, а фича и исправлять её никто не будет.
ага, супер фича, просто отпад,все пользователи балдеют
может подскажите как заставить друпал считать сессии по человечески ?
неужели никто с этим делом не воевал?
Самый простой способ. Найди файле user.module в функции user_block код:
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 на:
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, и вставить в него скопированный код.
Ну вообще, это все извращения, лично мне удобнее видеть список активных сессий, а не юзеров. Как минимум можно убедиться не увели ли у кого-нибудь акк.
спасибо большое! буду пробовать
+ если один и тот же юзер пытался зайти на сайт, но 500 (или еще что... Bad Gateaway) с одной стороны сессия не защитана - доступа к сайту нет. Логинишся еще раз - сессия защитана, но тебя на сайте уже несколько.
(1 юзер * 1 комп * 1 браузер) + 2 попытки = 2 юзера.... как ни крути )))
у меня совсем дургой стоит
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;
}
}
}
......................
Что тут изменить?
Этого не может быть. Я для Шестого Друпала пример приводил, у него, вне зависимости от minor версии, ядро одинаковое.
а что делать с Пятым?
вы же меня пригласили, там написано 5.х
а здесь совсем другое
http://drupal.org/node/83468#comment-446689
патч не помог
все равно показывает двойные сессии