Show online visitors in a Block (Drupal 7)

Estimated reading time of this article: 4 minutes

You want to see the number of online anonymous visitors. This can easily be done with a PHP snippet in block. The PHP Filter module must be enabled.

Additionally, the location is shown if found. Crawlers are shown separately.

<?php/* Code based on http://www.phpcodester.com/2011/04/drupal-7-block-for-whos-online-with-guests/ */if (user_access('access content')) {    $spiders = array('google', 'fatlens', 'yahoo', 'altavista', 'yandex', 'baidu', 'bing', 'thefind', 'bot', 'spider', 'crawl');    $now = $_SERVER['REQUEST_TIME'];    $interval = $now -  3600 * 6 /*variable_get('user_block_seconds_online', 3600 * 6)*/;    $output = "<div class = "visitor-ips">";    $max_users = 12; //variable_get('user_block_max_list_count', 10);    /*$authenticated_count = db_query("SELECT COUNT(DISTINCT s.uid) FROM {sessions} s WHERE s.timestamp >= :timestamp AND s.uid > 0", array(':timestamp' => $interval))->fetchField();    if ($authenticated_count && $max_users) {        $output.="<h3>Registered Users</h3>";        $items = db_query_range('SELECT u.uid, u.name, MAX(s.timestamp) AS max_timestamp FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.timestamp >= :interval AND s.uid > 0 GROUP BY u.uid, u.name ORDER BY max_timestamp DESC', 0, $max_users, array(':interval' => $interval))->fetchAll();        $output .= theme('user_list', array('users' => $items));    }*/    $guest_count = db_query("SELECT COUNT(DISTINCT s.hostname) FROM {accesslog} s WHERE s.timestamp >= :timestamp", array(':timestamp' => $interval))->fetchField();    $output .= "$guest_count visitor(s)";    $output .= ' since ' . date('H:i d.m', $interval) /*. ' (' . date('H:i d.m', $now) . ')' . " ($interval)"*/;    $sData = array();        $gData = array();    if ($guest_count && $max_users) {        $items = db_query_range('SELECT s.hostname, MAX(s.timestamp) AS max_timestamp FROM {accesslog} s WHERE s.timestamp >= :interval GROUP BY s.hostname ORDER BY max_timestamp DESC', 0, $max_users, array(':interval' => $interval))->fetchAll();        foreach ($items as $item) {                        $ip = $item->hostname;            $host = preg_replace('/[^a-zA-Z\.]/', '', gethostbyaddr($ip));            if ($host == "...") $host = "Unknown Hostname";            $spider = 0;            foreach ($spiders as $spider) {                if (strpos($host, $spider) !== false){                    $spider=1;                                        //$item['spider'] = 1;                    break;                }            }            if ($spider == 1) {                $sData[]=array('ip' => $ip, 'host' => $host, 'timestamp' => $item->max_timestamp);            } else {                $gData[]=array('ip'=>$ip, 'host'=>$host, 'timestamp' => $item->max_timestamp);            }        }    }    if (isset($gData) && count($gData)>0){        // $output .= "<h3>Guests</h3>";        $output .= "<ul>";        foreach ($gData as $d){            $output .= "<li>" . check_plain($d['host']) . ', ' . check_plain($d['ip']);            $loc = unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip='.$d['ip']));            if ($loc['geoplugin_city'].$loc['geoplugin_region']!=''){                $output .= ", " . check_plain($loc['geoplugin_city']) . ", " . check_plain($loc['geoplugin_region']);            }            if ($loc['geoplugin_countryName'] != ''){                $output .= ", " . check_plain($loc['geoplugin_countryName']);            }            $output .= ', ' . date('H:i', $d['timestamp']);            $output .= "</li>";        }        $output .= "</ul>";    }    if (isset($sData) && count($sData)>0){        $output .= "Spiders:";        $output .= "<ul>";        foreach ($sData as $d) {            $output .= "<li>" . check_plain($d['host']) . ", " . check_plain($d['ip']) . ', ' . date('H:i', $d['timestamp']) . "</li>";        }        $output .= "</ul>";    }        $output .= " </div>";    return $output;}?>

This code is based on http://www.phpcodester.com/2011/04/drupal-7-block-for-whos-online-with-g...