Скрипт Пользователей онлайн

Discussion in 'PHP' started by SXtingeR13, 16 Mar 2009.

  1. SXtingeR13

    SXtingeR13 New Member

    Joined:
    26 Feb 2009
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Кто может поделиться скриптом пользователей онлайн, кто шас на портале показывал цифрами, сколько их шас, не нагружая сервер.
     
  2. .:EnoT:.

    .:EnoT:. Сексуальное чудовище

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    А там делать по сути нечего.
    Берёшь сессию каждого, берёшь таймстамп и записываешь в БД. При каждом обновлении страницы обновляешь данные и удаляешь записи тех пользователей, которые не проявили активность в течении N минут)
    А вывод просто SELECT COUNT (*) и т.д...
     
  3. AkyHa_MaTaTa

    AkyHa_MaTaTa Elder - Старейшина

    Joined:
    19 Mar 2007
    Messages:
    557
    Likes Received:
    306
    Reputations:
    27
    Ну таких скриптов прут пруди, забей в гугле, или как написал .:EnoT:. напиши сам.
     
    1 person likes this.
  4. .:EnoT:.

    .:EnoT:. Сексуальное чудовище

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    Я думаю лучше запостить пример.


    Создаём таблицу:
    Code:
    CREATE TABLE `sessions` (
      `sid` varchar(32) NOT NULL,
      `lastdate` datetime NOT NULL
    ) ENGINE=MyISAM;
    
    Сам скрипт:

    PHP:
    <?php
    session_start
    ();

    $interval 15//Интервал бездействия пользователя в минутах  

    $sid session_id(); //Берём ID сессии

    $sql mysql_query("SELECT * FROM `sessions` WHERE `sid` = '".$sid."'");


    if(
    $sql && mysql_num_rows($sql)){
        
        
    /*
          Если сессия с таким ID уже записана, обновляем
        */ 
        
    mysql_query("UPDATE `sessions` SET `lastdate` = NOW() WHERE `id_session`='".$sid."'");
        
    }else{
        
        
    /*
          Если нет, добавляем
        */    
        
    mysql_query("INSERT INTO `sessions` VALUES('".$sid."', NOW())");
    }

    /*
      Удаляем записи пользователей не проявивших активность
      в течении времени указанного в $interval
    */

    mysql_query("DELETE FROM `sessions` WHERE `lastdate` < NOW() - INTERVAL '".$interval."' MINUTE");


    ?>


    И вывод типа того:
    Code:
    SELECT COUNT(*) AS `online` FROM `sessions`
     
    1 person likes this.
  5. bombeg

    bombeg Member

    Joined:
    27 Oct 2008
    Messages:
    136
    Likes Received:
    83
    Reputations:
    8
    .:EnoT:., прочитай про ON DUPLICATE
     
  6. .:EnoT:.

    .:EnoT:. Сексуальное чудовище

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    bombeg, В своих скриптах использую, а это всего лишь пример. Может мне следовало бы ещё класс работы с mysql выложить, что всё было круто? Зачем? Если ТС в этом разбирается он без труда заточит как надо. Или например может добавить IGNORE, ключи...да в общем что угодно
     
  7. SXtingeR13

    SXtingeR13 New Member

    Joined:
    26 Feb 2009
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Думаю вариант не такой

    Собственно скрипт:
    <?Php
    session_start();
    define("MAX_IDLE_TIME", 3);
    function getOnlineUsers(){
    if ( $directory_handle = opendir( session_save_path() ) ) {
    $count = 0;
    while ( false !== ( $file = readdir( $directory_handle ) ) ) {
    if($file != '.' && $file != '..'){
    if(time()- fileatime(session_save_path() . '\\' . $file) < MAX_IDLE_TIME * 60) {
    $count++;
    }
    } }
    closedir($directory_handle);
    return $count;
    } else {
    return false;
    }}
    echo 'Пользователей онлайн: ' . getOnlineUsers() . '<br />';
    >
    Подсчёт пользователей, стоит на месте, сесия необновляеться,
    если только таким действием его убивать

    session_save_path("/path/to/custom/directory");

    А если путь до дир незнаеш как быть?
     
  8. rcc0023

    rcc0023 Elder - Старейшина

    Joined:
    3 Jul 2008
    Messages:
    100
    Likes Received:
    6
    Reputations:
    0
    Уф.. предложу другой вариант:
    В базе создать таблицу с полями: id,ip,br,date
    Там где нужно вывести число онлайн:

     
    #8 rcc0023, 16 Mar 2009
    Last edited: 16 Mar 2009
  9. SXtingeR13

    SXtingeR13 New Member

    Joined:
    26 Feb 2009
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Ето понятно, есчё + подключить скрипт, если несложно допиши его, зарание благодарен