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

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

  • md5

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

    Spritz 17 июля 2007 г. 14: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 != &#39;.&#39; &amp;&amp; $file != &#39;..&#39;)
    {
    //Здесь мы выбираем файлы измененные не более 15 минут назад
    if(time()- fileatime(session_save_path() . &#39;\\&#39; . $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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    $user_info[&#39;total_time_logged_in&#39;] += time() - $_SESSION[&#39;timeOnlineUpdated&#39;];
    $_SESSION[&#39;timeOnlineUpdated&#39;] = time();
    }

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

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

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

    Spritz 28 июля 2008 г. 9: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

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

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

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

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

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

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


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

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

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

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