ФорумПрограммированиеПыхнуть хотите?F.A.Q. → Кто сейчас на сайте или пользователи онлайн.

Кто сейчас на сайте или пользователи онлайн.

  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 18 июля 2007 г. 1:12

    Кто сейчас на сайте или пользователи онлайн.


    Под данным выражением понимается количество или список посетителей, активность на сайте которых была зарегистрирована в определенный промежуток времени (к примеру за последние 15 минут).

    Главное уяснить, что связь с php приложением не постоянна! Это не ICQ, где можно узнать статус пользователя по соединению с ним. Здесь php сценарий выполнился и отдался пользователю, а что он дальше сделает известно только ему. Он может продолжить ходить по сайту, а может и закрыть окно.

    Итак, переосмыслив задачу, мы выяснили, что нам необходимо выбирать пользователей, которые были активны ближайшие, допустим, 15 минут.

    Как нам это сделать? — Очень просто. Необходимо просто считать сессии пользователей.

    Вариант 1.

    Если сессии хранятся в файлах (используются стандартные сессии), то нам необходимо открыть директорию, в которой хранятся сессии и посчитать количество файлов, изменённых не более 15 минут назад.

    Если у Вас не установлена директория для хранения сессионных файлов, необходимо первой строкой написать:
    session_save_path("/path/to/custom/directory");


    А теперь собственно функция, которая выводит количество пользователей, активных в течении последних 15 минут:


    <?php
    function getOnlineUsers()
    {
    if ($directory_handle = opendir(session_save_path()))
    {
    $count = 0;
    while (false !== ($file = readdir($directory_handle)))
    {
    if($file != '.' && $file != '..')
    {
    //Здесь мы выбираем файлы измененные не более 15 минут назад
    if(time()- fileatime(session_save_path() . '\\' . $file) < 15 * 60)
    {
    $count++;
    }
    }
    }
    closedir($directory_handle);
    return $count;
    }
    else
    {
    return false;
    }
    }
    ?>


    Преимущества:
    — Не надо заморачиваться с базой, сессия стартует одной строкой — session_start();
    — Не надо удалять сессии (они удаляются автоматически по истечении срока, указанного в php.ini);

    Недостатки этого варианта:
    — Мы узнаем только количество посетителей, а не их данные, для этого случая все-таки подойдёт 2 вариант.

    Вариант 2.

    Это очень просто сделать, когда сессии пользователей хранятся в базе. Здесь количество пользователей онлайн выбирается с помощью одного запроса.
    пример:

    SELECT COUNT(`id`)
    FROM `users_sessions`
    WHERE `time`>NOW()-15*60


    Так же можно с легкостью выбрать данные пользователей.
    например, логины:

    SELECT `login`
    FROM `users_sessions`
    WHERE `time`>NOW()-15*60


    Решать Вам, что необходимо Вашему сайту: более подробная статистика или лёгкая сводка.
    все умрут, а я изумруд
  • Patrick

    Сообщения: 506 Репутация: N Группа: Кто попало

    Spritz 18 июля 2007 г. 5:33, спустя 4 часа 21 минуту 35 секунд

    MD, есть же session_set_save_handler! а вообще это ситуация по обстоятельствам….
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 18 июля 2007 г. 12:29, спустя 6 часов 55 минут 30 секунд

    дополни фак
    все умрут, а я изумруд
  • XoxMa

    Сообщения: 135 Репутация: N Группа: Кто попало

    Spritz 16 апреля 2008 г. 20:57, спустя 273 дня 8 часов 28 минут

    кто-нить знает, как написать скрипт сколько пользователь времени провёл на сайте?
    я посмотрел на этом smf форуме, там было что-то наподобии этого:

    // Mark your session as being logged.
    $_SESSION['log_time'] = time();

    // Well, they are online now.
    if (empty($_SESSION['timeOnlineUpdated']))
    $_SESSION['timeOnlineUpdated'] = time();

    // Set their login time, if not already done within the last minute.
    if (SMF != 'SSI' && !empty($user_info['last_login']) && $user_info['last_login'] < time() - 60)
    {
    // Don't count longer than 15 minutes.
    if (time() - $_SESSION['timeOnlineUpdated'] > 60 * 15)
    $_SESSION['timeOnlineUpdated'] = time();

    $user_settings['totalTimeLoggedIn'] += time() - $_SESSION['timeOnlineUpdated'];
    updateMemberData($ID_MEMBER, array('lastLogin' => time(), 'memberIP' => '\'' . $user_info['ip'] . '\'', 'memberIP2' => '\'' . $_SERVER['BAN_CHECK_IP'] . '\'', 'totalTimeLoggedIn' => $user_settings['totalTimeLoggedIn']));

    if (!empty($modSettings['cache_enable']) && $modSettings['cache_enable'] >= 2)
    cache_put_data('user_settings-' . $ID_MEMBER, $user_settings, 60);

    $user_info['total_time_logged_in'] += time() - $_SESSION['timeOnlineUpdated'];
    $_SESSION['timeOnlineUpdated'] = time();
    }

    //////// большой пропуск /////////

    // Figure out how long they've been logged in.
    $context['user']['total_time_logged_in'] = array(
    'days' => floor($user_info['total_time_logged_in'] / 86400),
    'hours' => floor(($user_info['total_time_logged_in'] % 86400) / 3600),
    'minutes' => floor(($user_info['total_time_logged_in'] % 3600) / 60)
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz 28 июля 2008 г. 20:56, спустя 102 дня 23 часа 58 минут

    Мой способ, работает с тхт файлом
    Небольшое описание внутри
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 28 июля 2008 г. 21:03, спустя 6 минут 51 секунду

    уменя способ проще
    я хран сессии в бд и при каждомновом заходе на сайт обновляю дату последнего входа
    поэтому уменя не стоитьвопрос сколько ихя просто смотрю по БД сколько сессий было обновлено в течении последних 5 минут и все

    ЗЫ на сайте воощето ни одного пользователя нет)))
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 28 июля 2008 г. 22:42, спустя 1 час 39 минут 2 секунды


    уменя способ проще
    я хран сессии в бд и при каждомновом заходе на сайт обновляю дату последнего входа
    поэтому уменя не стоитьвопрос сколько ихя просто смотрю по БД сколько сессий было обновлено в течении последних 5 минут и все

    ЗЫ на сайте воощето ни одного пользователя нет)))

    у меня сессии через save_handler в базу пишутся, считаю COUNT .. ну тоже самое
    все умрут, а я изумруд

Пожалуйста, авторизуйтесь, чтобы написать комментарий!