Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2013, 17:24   #1
wanes101
Форумчанин
 
Регистрация: 04.06.2010
Сообщений: 212
По умолчанию Проверка онлайн статуса на сайте

Здравствуйте
Я хочу найти наиболее оптимальное решение для этого дела.
Изначально думал просто писать активных юзеров в файл и через ajax делать запросы к серверу что он онлайн, что изначально и сделал, но подумал может это очень архаично ну и начал читать форумы и решил написать письмо.
Думаю наиболее быстрый способ это использование БД, но это мне кажется нерационально, почему понять не могу понять по этому и пишу письмо.
Также думаю может писать в сессию список активных юзеров.
Что наиболее верно?

Так же хочу понять на сколько удачный скрипт получился по контролю активных юзеров, он работает след. о. делается запрос на сервер ?udate&id=5 (_Get или post любой ) где параметры и так ясны, вот сам код из него я не удалял не используемые функции, какова оценка кода:
PHP код:
<?php

    $params
=array_merge ($_GET,$_POST);
    if (
sizeof($params)>0)    Main($params);
    
    function 
Main($params)
    {
        if (isset(
$params["add_online"]) and  $params["id"]) AddOnline($params["id"]);
        if (isset(
$params["clear"])) ClearOnline();
        if (isset(
$params["Get_Online"]))  OutListUserOnline();
        if (isset(
$params["remove_online"]) and $params["id"]) RemoveUserOnline($params["id"]);
        if (isset(
$params["udate"]) and $params["id"]) UdateUser($params["id"]);
        return;
    }
    
    function 
AddOnline($id )
    {
        
$fp fopen('Online_user.txt''a+');
        
$list=GetListUsersOnline();
        if (
$list!=false)
            {
                foreach (
$list as $n=>$user)
                if (
$user[0]==(int)$id) return;
            }
        if (!
$fp$fp=fopen('Online_user.txt''w+'); 
        
$time_update=time();
        
fwrite($fp"$id$time_update;\n");
        
fclose($fp);
        return;
    }
    
    
    function 
RemoveUserOnline($id)
    {
        
$users GetListUsersOnline();
        if (!
$users) return;
        foreach (
$users as $n=>$user)
        if (
$user[0]==(int)$id)
        {
            
$users[$n][0]=false;
            break;
        }
        
$fp=fopen('Online_user.txt''w+');
        foreach (
$users as $n =>$user)
        if (
$user[0]!=falsefwrite($fp$user[0]." ".$user[1]."\n");
        
fclose($fp);
        return;
    }
    Function 
ClearOnline()
    {
        
unlink ("Online_user.txt");
        return;
    }
    
    function 
OutListUserOnline()
    {    
        
$id=0;
        
$time=0;
        
$list=GetListUsersOnline();
        if (!
$list) return;
        foreach (
$list as $n=>$user)
        {
            foreach (
$user as $n=>$val)
            switch (
$n
            {
                case 
0$id= (int)$val;
                case 
1$time=(int)$val;
            }
            echo 
"< user id=$id udate=$time>< /user >";
        }
    }
    
    function 
GetListUsersOnline()
    {
        
$id=0;
        
$time=0;
        
$list=array();
        
$arr =file ('Online_user.txt');
        if (!
$arr) return false;
        foreach (
$arr as $n=>$str_user)
        
preg_match_all('/[0-9]{1,};/',$str_user,$users[$n],PREG_PATTERN_ORDER);
        foreach (
$users as $n =>$user)
        
$list[$n]=$user[0];
        return 
$list;
    }
    
    function 
UdateUser($id)
    {    
        
AddOnline($id);
        
$users=GetListUsersOnline();
        if (!
$users) return;
        foreach (
$users as $n =>$user)
        {
            if (
$user[0]==(int)$id$users[$n][1]=time();
            if ((
time()-$user[1])>60$users[$n][0]=false;
        }
        
$fp fopen('Online_user.txt''w+');
        foreach (
$users as $n =>$user)
        if (
$user[0]!=falsefwrite($fp, (int)$user[0]."; ".(int)$user[1].";\n");
        
fclose($fp);
        
OutListUserOnline();
    }
    
?>
wanes101 вне форума Ответить с цитированием
Старый 03.12.2013, 17:30   #2
wanes101
Форумчанин
 
Регистрация: 04.06.2010
Сообщений: 212
По умолчанию

А упустил о принципе работы скрипта если юзер не апдейтится более 60сек то при апдейте другого юзера он становиться не активным и удаляется из файла
wanes101 вне форума Ответить с цитированием
Старый 03.12.2013, 21:19   #3
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

вся эта бадяга на файлах очень скоро, при хорошей посещаемости начнет сбоить. При одновременном доступе к файлу, тогда придется делать блокировки, что в свою очередь будет тормозить работу скриптов - они будут ждать освобождения файлов.

Боятся БД не надо, чем вам она не нравится?

Ну и Аяксово постоянно фигачить просто чтоб знать статус.... чет мне кажется нерационально. А если 100 пользюков? С каким интервалом они у вас аяксятся?
Опять же, если я зашел, авторизировался а потом свернул окно и все... постоянно аяксится я типа онлайн - а мне и дела нет.

Обычно делают обновление и проверку во время каких то действий пользователя, и интервал в 5 минут.... при любом действии пользователя, переходе вы ж все равно проверяете - а он залогинен или нет... так вот там же и апдейте....

кстати то что вы тут расписали на кучу строк - при использовании БД будет в 5-6 строки
ADSoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка статуса пользователя. Gefo PHP 3 11.03.2013 11:45
Онлайн на сайте указанное время в секундах, как? FleXik Общие вопросы Delphi 2 10.02.2013 21:53
Нужен совет по онлайн-анкете на сайте makskovalko PHP 2 21.08.2012 18:31
Проверка статуса somnium Работа с сетью в Delphi 1 19.06.2012 12:18
Онлайн выбор и покупки билетов на сайте Brainwasher HTML и CSS 2 19.09.2011 19:14