1

Тема: Кто на сайте

Хочу чтобы страуберри умела выводить список находящихся сейчас на сайте пользователей.

Re: Кто на сайте

Такие фичи добавляют достаточно много запросов к БД...

3

Re: Кто на сайте

А это важно? Просто я в это не разбираюсь.

Re: Кто на сайте

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

5

Re: Кто на сайте

А если плагином сделать? Включать, чтобы можно было, выключать. Кому надо - включит, кому не надо - нет.

Re: Кто на сайте

в смысле, чтобы вообще любой юзер мог включать/выключать плагин?

Если так, то несмотря на мои скудные познания, я почему-то уверен, что сделать это будет еще сложней + у Strawberry появится уязвимость - по нажатию на ссылку включения/выключения запрос на это действие будет направляться в админку в обход пароля и прочих (установленных админом) систем безопасности.

7

Re: Кто на сайте

Да не, пашто любой пользователь-то?
Я имею ввиду, пользователь страуберри - кому надо, кому не надо. Мне надо - я у себя включу. Aurum'у вот не надо, он и включать не будет.

Re: Кто на сайте

в этом случае реально увеличивается нагрузка на БД

Re: Кто на сайте

кто он-лайн это вещь полезная, но насчет реализации в коде чё-та никто не берёться sad
по поводу выслушенного(прочтенного) выше: сделать как плагин или как не плагин это пох.. но возможность пользователю включить и выключить должна присутствовать. хотя бы при заходе на сайт у пользователя есть некии права к доступу в админку.... так вот можно дать права юзеру на просмотор "кто в он-лайне?" и сделать так что бы он сам мог включать и отключать для себя просмотр "кто в онлайн" или сделать это в кукках - при входе кидаються юзеру куки в них указана переменная. перед тем как выводить

<? if ($see_who_online) { echo who_on_line; }

но дать возможность в профиле юзеру указать что он желает видеть кто он-лайн (после чего эта переменная в куку кидаться не будет) или как-нить так...
естественно что это будет влиять на запрос к БД, но разве на запросы к БД не влияет например мета-теги и т.п.?

Re: Кто на сайте

а так не получиться?

здесь был неправильный код

UPD: не получиться wink получиться так:

<?
if ($member['id']) {
   $lv = time ();
   $ido = $member['id'];
   $sql->update(array(
      'table'  => 'users',
      'where'  => array("id = $ido"),
      'values' => array('last_visit' => $lv)
   ));
}
echo '<b>Online:</b>';

$deadlinetime = time() - 300;
foreach ($users as $v) {
   echo '<ul>';
   if ($v['last_visit'] >= $deadlinetime) {
      echo '<li>'.$v['username'].'</li>';
   }
   echo '</ul>';
}
?>

UPD2: забыл! еще перед первым эхо нужно unset ($ido), ибо нужно.

Отредактировано goodboy (11 Nov 2006 15:41:45)

11

Re: Кто на сайте

goodboy, переменную $id переименуй, она нужна скрипту.

Признанный мастер чинпоко, а-ай ^_^

12

Re: Кто на сайте

А как вывести еще количество? Например имена есть, а количество ? Пользователей: 10
И возможно ли сделать так:
Гости: 20
Пользователи: 10

Отредактировано СвутЪ_ (13 Feb 2007 21:06:39)

13

Re: Кто на сайте

СвутЪ_, вот в этой конструкции из поста #10:

foreach ($users as $v) {
   echo '<ul>';
   if ($v['last_visit'] >= $deadlinetime) {
      echo '<li>'.$v['username'].'</li>';
   }

нужно добавить переменную-счетчик, чтобы было примерно так:

$ii = 0;
foreach ($users as $v) {
   echo '<ul>';
   if ($v['last_visit'] >= $deadlinetime) {
      echo '<li>'.$v['username'].'</li>';
      $ii++;
   }

тогда переменная $ii будет считать количество зарегистрированных пользователей. Для "гостей" этот метод не подойдет. Поможет такая функция (как-то раньше использовал):

function my_static() {
        $data="online.dat";
        $time=time();
        $past_time=time()-300;

        $readdata=fopen($data,"r") or die("Не могу открыть файл $data");
        $data_array=file($data);
        fclose($readdata);

        if (getenv('HTTP_X_FORWARDED_FOR'))
               $user = getenv('HTTP_X_FORWARDED_FOR');
        else
             $user = getenv('REMOTE_ADDR');

        $d=count($data_array);
        for($i=0;$i<$d;$i++)
                {
               list($live_user,$last_time)=explode("::","$data_array[$i]");
               if($live_user!=""&&$last_time!=""):
               if($last_time<$past_time):
                        $live_user="";
                        $last_time="";
                endif;
                if($live_user!=""&&$last_time!="")
                        {
                        if($user==$live_user)
                                {
                                $online_array[]="$user::$time\r\n";
                                }
                        else
                                $online_array[]="$live_user::$last_time";
                        }
                endif;
                }

        if(isset($online_array)):
        foreach($online_array as $i=>$str)
                {
                if($str=="$user::$time\r\n")
                        {
                        $ok=$i;
                        break;
                        }
                }
        foreach($online_array as $j=>$str)
                {
                if($ok==$j) { $online_array[$ok]="$user::$time\r\n"; break;}
                }
       endif;

        $writedata=fopen($data,"w") or die("Не могу открыть файл $data");
        flock($writedata,2);
        if($online_array=="") $online_array[]="$user::$time\r\n";
        foreach($online_array as $str)
                fputs($writedata,"$str");
        flock($writedata,3);
        fclose($writedata);

        $readdata=fopen($data,"r") or die("Не могу открыть файл $data");
        $data_array=file($data);
        fclose($readdata);
        $online=count($data_array);
        
return $online;
}

Вызывать ее нужно так <?=my_static();?>, она покажет количество посетителей он-лайн (и гостей и пользователей).

Теперь, чтобы решить вашу задачу "дословно", можно сделать так:

echo 'Сейчас на сайте<br />';
echo 'Пользователей: '.$ii.'<br />'; //Количество зарегистрированных
$jj = my_static(); //Определяем количество посетителей всего в он-лайне
$kk = $jj - $ii; //Определяем количество гостей (всего минус зарегистрированных)
echo 'Гостей: '.$kk.'<br />';

У этого метода есть один минус - данные об общем количестве пользователей в он-лайн будут записываться в отдельный файл online.dat, но зато все будет работать!

14

Re: Кто на сайте

Я так понял что полный код будет выглядеть так:

<?
if ($member['idd']) {
   $lv = time ();
   $ido = $member['idd'];
   $sql->update(array(
      'table'  => 'users',
      'where'  => array("idd = $ido"),
      'values' => array('last_visit' => $lv)
   ));
}
echo '<b>Пользователей:</b>';

$deadlinetime = time() - 300;
foreach ($users as $v) {
  
   if ($v['last_visit'] >= $deadlinetime) {
      echo '<br>'.$v['username'].'';
   }
   
}
$ii = 0;
foreach ($users as $v) {
   echo '<ul>';
   if ($v['last_visit'] >= $deadlinetime) {
      echo '<li>'.$v['username'].'</li>';
      $ii++;
   }
    break;
                        }
                }
        foreach($online_array as $j=>$str)
                {
                if($ok==$j) { $online_array[$ok]="$user::$time\r\n"; break;}
                }
       endif;

        $writedata=fopen($data,"w") or die("Не могу открыть файл $data");
        flock($writedata,2);
        if($online_array=="") $online_array[]="$user::$time\r\n";
        foreach($online_array as $str)
                fputs($writedata,"$str");
        flock($writedata,3);
        fclose($writedata);

        $readdata=fopen($data,"r") or die("Не могу открыть файл $data");
        $data_array=file($data);
        fclose($readdata);
        $online=count($data_array);
        
return $online;
}
echo 'Сейчас на сайте<br />';
echo 'Пользователей: '.$ii.'<br />'; //Количество зарегистрированных
$jj = my_static(); //Определяем количество посетителей всего в он-лайне
$kk = $jj - $ii; //Определяем количество гостей (всего минус зарегистрированных)
echo 'Гостей: '.$kk.'<br />';
?>

Но он у меня почему-то не работает, выдаёт ошибку..

15

Re: Кто на сайте

СвутЪ_, а функцию my_static куда дели? Какую ошибку выдает?

16

Re: Кто на сайте

Да не внимательно посмотрел код wink
Сделал так:

<?
if ($member['idd']) {
   $lv = time ();
   $ido = $member['idd'];
   $sql->update(array(
      'table'  => 'users',
      'where'  => array("idd = $ido"),
      'values' => array('last_visit' => $lv)
   ));
}
echo '<b>Пользователей:</b>';

$deadlinetime = time() - 300;
foreach ($users as $v) {
  
   if ($v['last_visit'] >= $deadlinetime) {
      echo '<br>'.$v['username'].'';
   }   
}

$ii = 0;
foreach ($users as $v) {
   echo '<ul>';
   if ($v['last_visit'] >= $deadlinetime) {
      echo '<li>'.$v['username'].'</li>';
      $ii++;
   }

function my_static() {
        $data="online.dat";
        $time=time();
        $past_time=time()-300;

        $readdata=fopen($data,"r") or die("Не могу открыть файл $data");
        $data_array=file($data);
        fclose($readdata);

        if (getenv('HTTP_X_FORWARDED_FOR'))
               $user = getenv('HTTP_X_FORWARDED_FOR');
        else
             $user = getenv('REMOTE_ADDR');

        $d=count($data_array);
        for($i=0;$i<$d;$i++)
                {
               list($live_user,$last_time)=explode("::","$data_array[$i]");
               if($live_user!=""&&$last_time!=""):
               if($last_time<$past_time):
                        $live_user="";
                        $last_time="";
                endif;
                if($live_user!=""&&$last_time!="")
                        {
                        if($user==$live_user)
                                {
                                $online_array[]="$user::$time\r\n";
                                }
                        else
                                $online_array[]="$live_user::$last_time";
                        }
                endif;
                }

        if(isset($online_array)):
        foreach($online_array as $i=>$str)
                {
                if($str=="$user::$time\r\n")
                        {
                        $ok=$i;
                        break;
                        }
                }
        foreach($online_array as $j=>$str)
                {
                if($ok==$j) { $online_array[$ok]="$user::$time\r\n"; break;}
                }
       endif;

        $writedata=fopen($data,"w") or die("Не могу открыть файл $data");
        flock($writedata,2);
        if($online_array=="") $online_array[]="$user::$time\r\n";
        foreach($online_array as $str)
                fputs($writedata,"$str");
        flock($writedata,3);
        fclose($writedata);

        $readdata=fopen($data,"r") or die("Не могу открыть файл $data");
        $data_array=file($data);
        fclose($readdata);
        $online=count($data_array);
        
return $online;
}

echo 'Сейчас на сайте<br />';
echo 'Пользователей: '.$ii.'<br />'; //Количество зарегистрированных
$jj = my_static(); //Определяем количество посетителей всего в он-лайне
$kk = $jj - $ii; //Определяем количество гостей (всего минус зарегистрированных)
echo 'Гостей: '.$kk.'<br />';
?>

Выдаёт ошибку : Parse error: parse error, unexpected $end in z:\home\clan.lh\www\index.php on line 605

605 Строка конец страницы "</body></html>"

17

Re: Кто на сайте

СвутЪ_, забыли скобку. Перед фрагментом

function my_static() {
        $data="online.dat";

забыли поставить

echo '</ul>';
}

То есть код из поста #10 нужно было дословно вставить (но с изменениями относительно $ii), потом мою функцию, а потом "Сейчас на сайте". Успехов!

Re: Кто на сайте

Если я залил это в блок через , то в какую деректорию я должен пропписывать online.dat ?

19

Re: Кто на сайте

AndrewE, а он сам пропишется в папку рядом со страницей, из которой будет вызываться функция. Не обращайте внимание wink

20

Re: Кто на сайте

чёт оно не работает... я зашел как Администратор.. и Пользователем пробовал... мне пишет Пользователей: 0, Гостей: 1..
Меня считает как за гостя..

Re: Кто на сайте

Сделал так:

Сейчас на сайте: <?=my_static();?>
<?
if ($member['id']) {
   $lv = time ();
   $ido = $member['id'];
   $sql->update(array(
      'table'  => 'users',
      'where'  => array("id = $ido"),
      'values' => array('last_visit' => $lv)
   ));
}

$deadlinetime = time() - 300;
$ii = 0;
foreach ($users as $v) {
   echo '<ul>';
   if ($v['last_visit'] >= $deadlinetime) {
            $ii++;
   }
   echo '</ul>';
}

echo 'Пользователей: '.$ii.'<br />'; //Количество зарегистрированных
$jj = my_static(); //Определяем количество посетителей всего в он-лайне
$kk = $jj - $ii; //Определяем количество гостей (всего минус зарегистрированных)
echo 'Гостей: '.$kk.'<br />';
?>

Вроде работает.
P.S. Можно было-бы использовать код счетчика из новой версии  Strawberry 1.2 Beta 4, которую создал  Miksar, но.... подробно объяснить что где и как может, наверное, только сам Miksar. Хотя, видать, скоро ПРИДЁТСЯ создавать новые сайты на основании его работы smile

Re: Кто на сайте

У меня все просто, к тому же полно комментариев ))

Здесь молодость бродит крылато, и старость не клонит голов...
Демо площадка Strawberry 1.2 - заходим и тестируем!

Re: Кто на сайте

Написал раньше код со своим видением статистики на сайте, а затем заметил, что он работает только для категорий, созданных на сайте.
А вот на отдельных файлах, где можно создать отдельную тематику... вышеуказанный код не работает - проблема с путями к online.dat. Не помогло и написание различных видов путей...
Пришлось искать сторонний взгляд на подсчёта всех на сайте.
Создал отдельную таблицу в базе

CREATE TABLE sessions
(
  id INT NOT NULL AUTO_INCREMENT,
  session_id TEXT NOT NULL,
  last_time INT NOT NULL,
  PRIMARY KEY (id)
);

В шаблонную страницу вставил код:

Сейчас на сайте: <?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) VALUES('". session_id() ."', '". $current_time ."')");
    }
    else {
        $row = mysql_fetch_array($res);
        // Обновляем таблицу
        mysql_query("UPDATE sessions SET last_time = '". $current_time ."' WHERE session_id = '". session_id() ."'");
    };
        $online_time = time() - 300;
    // Выбираем пользователей, активность которых была не позднее 5-ти минут назад
    $res = mysql_query("SELECT * FROM sessions WHERE last_time > '". $online_time ."'");
    print mysql_num_rows($res);
?>
</label>
<?
if ($member['id']) {
   $lv = time ();
   $ido = $member['id'];
   $sql->update(array(
      'table'  => 'users',
      'where'  => array("id = $ido"),
      'values' => array('last_visit' => $lv)
   ));
}

$deadlinetime = time() - 300;
$ii = 0;
foreach ($users as $v) {
   echo '<ul>';
   if ($v['last_visit'] >= $deadlinetime) {
            $ii++;
   }
   echo '</ul>';
}

echo '<label class=label3>Пользователей: '.$ii.'</label><br />'; //Количество зарегистрированных
$jj = mysql_num_rows($res);  //Определяем количество посетителей всего в он-лайне
$kk = $jj - $ii; //Определяем количество гостей (всего минус зарегистрированных)
echo '<label class=label3>Гостей: '.$kk.'</label><br />';
?>

В блоке

    mysql_connect('localhost', 'root', '12345');
    mysql_select_db('test');

нужно написать свои данные к базе sad
Вышла этакая мутация счётчика всех, кто на сайте со счётчиком с Клубники.

P.S. Грубо всё и топорно, но работает smile

Отредактировано olafsen (28 Feb 2011 17:40:25)