За последние 24 часа нас посетили 18996 программистов и 1622 робота. Сейчас ищут 788 программистов ...

Кто на сайте

Тема в разделе "Прочие вопросы по PHP", создана пользователем newpdv, 14 июн 2009.

  1. newpdv

    newpdv Активный пользователь

    С нами с:
    14 июн 2009
    Сообщения:
    13
    Симпатии:
    0
    Здравствуйте програмисты!
    Скажите как можно узнать кто на сайте?
    Какие есть варианты
     
  2. Jensi

    Jensi Активный пользователь

    С нами с:
    9 апр 2009
    Сообщения:
    299
    Симпатии:
    0
    Как это кто есть на сайте? Сколько человек, страна, ОС - это что ли?
    Вариант: написать скрипт или скачать или заказать:)
     
  3. akrinel

    akrinel Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    Что-то как-то мало кто пишет.
    Запостю один простенький вариант(ахтунг подходит для проектов с не очень высокой нагрузкой).

    1.
    Создаем таблицу users_online:
    [sql]
    CREATE TABLE `users_online`(
    `uid` INT NOT NULL,
    `last_update` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE(`uid`),
    INDEX(`last_update`)
    );
    [/sql]

    2.
    Когда пользователь логинится выполняем
    [sql]
    INSERT INTO `users_online`
    SET `uid`=5;
    [/sql]

    3.
    Когда пользователь посещает какую-нибудь страничку выполняем
    [sql]
    UPDATE `users_online`
    SET `last_update` = NOW()
    WHERE `uid`=5;
    [/sql]

    Разумеется можно совместить 2. и 3. пункты и вызывать всегда один и тот же запрос:
    [sql]
    INSERT INTO `users_online`(`uid`) VALUES (5)
    ON DUPLICATE KEY UPDATE
    `last_update`=NOW();
    [/sql]


    4. Когда пользователь разлогинивается выполняем:
    [sql]
    DELETE FROM `users_online`
    WHERE `uid`=5;
    [/sql]


    5. Допустим, пользователь, который не посещает ни одной страницы в течении 15-ти минут ушел с сайта.
    Поэтому по крону выполняем такой запрос:

    [sql]
    DELETE FROM `users_online`
    WHERE `last_update` < NOW()-900;
    [/sql]

    900=15 минут * 60 секунд


    6. Ну и наконец, выполнив:
    [sql]
    SELECT `uid` FROM `users_online`
    [/sql]
    Мы получим id-ки пользователей, который онлайн в данный момент.
    Что бы получить их с именами можно выполнить
    [sql]
    SELECT `u`.`name` FROM `users_online` AS `uo`
    LEFT JOIN `users` AS `u`
    ON `u`.`id`=`uo`=`uid`;
    [/sql]

    или

    [sql]
    SELECT `name` FROM `users` WHERE `id` IN (SELECT `uid` FROM `users_online`);
    [/sql]

    по вкусу.
     
  4. newpdv

    newpdv Активный пользователь

    С нами с:
    14 июн 2009
    Сообщения:
    13
    Симпатии:
    0
    akrinel, благодарю.
    А без крон никак нельзя?
     
  5. akrinel

    akrinel Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    newpdv, с ходу могу придумать два варианта:

    1. Записываем (в файл, в БД, неважно) дату последней "чистки"
    и сверяем ее при каждом заходе пользователя.
    Если с момента последней чистки прошло более 15 минут чистим таблицу.

    Получаем лишний запрос к БД/файлу каждый раз при заходе пользователя
    + сильный "провал" при обновлении таблицы онлайн.

    2. Вариант на который плюются многие старожилы, но все же ИМХО имеющий право на существование:

    Смотрим статистику и обнаруживаем, что у нас заходит в среднем 100 пользователей в минуту.
    Соответственно заходит примерно 1500 пользователей за 15 минут.
    Значит, грубо говоря, с каждым 1500-м пользователем проходит 15 минут.

    При заходе пользователя делаем:
    PHP:
    1.  
    2. <?php
    3. $number  =  rand(1, 1500);
    4. if($number == 12){
    5.   // чистим таблицу онлайн пиплов
    6. }
    7. ?>
    8.  
    не получаем лишний запрос к БД/Файлу при каждом запросе, но точность 15 минутного интервала остается под вопросом.
    Ночью, это может быть значительно реже 15-ти минут, в период с 16 до 22(или какой там у вас "час пик" на ресурсе) немного чаще.

    Но оптимальным вариантом все равно, на мой взгляд, является крон.
     
  6. С выходом мускула 5.1 я бы сказал, что его встроенный евент шедулер оптимальней. Но это как всегда, решение не для нищебродов )