Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Юзеры в чате


Автор: Гость_Sirius 23.11.2005, 15:28
Как сделать чтоб юзеры, которые не кликнули на кнопку -выход- а закрыли чат закрыв окно чата, выкидывались из списка он-лайн юзеров..?
Можно это сделать каким-либо способом, но не способом тайм-аута , (где надо сохранять время, и если пользователь за это время не разу не кинул сообщений то он выкидывается, этот способ мне не нравится)..есть какой-нибудь еще способ?


Автор: Neitron 23.11.2005, 16:30
Нет.

Автор: Alix 23.11.2005, 18:36
если нечего делать можешь пинговать всех юзеров каждые 5 мин...
но тогда пролетают те, кто с прокси... Т.е. тебе с ними тяжело будет

Автор: DemoCode 23.11.2005, 18:44
Я где-то видел: при выходе из чата (закрытие окна) там в body по событию onUnload открывается маленькое окошко, с надписью типа "Спасибо, заходите ещё", и через несколько секунд оно закрывается. Это окошко запрашивает скрипт, который вычеркивает этого посетителя из списка активных. Но это нелучший вариант, но единственный способ сделать это не тайм-аутом.

Автор: Mal Hack 23.11.2005, 18:54
Можно повесить на OnClose и на OnExit открытие нового окна вызывающего скрипт выхода из чата, но это бред, который работает в 20-25% случаев, если не меньше.

Автор: R.M. 24.11.2005, 09:44
Если у тя есь чат то он скорей всево на фреймах, тогда обновляй фрейм например со списком юзеров и проверяй какой из юзеров присутствует (не пишет сообщений а именно присутствует) если он отсутствует скажем 10 сек он удаляется

И вобще почитай тему может чё поможет
http://forum.vingrad.ru/index.php?showtopic=66829&hl=
там этот вопрос и обсуждался как раз

Автор: Neitron 24.11.2005, 11:24
Цитата
Если у тя есь чат то он скорей всево на фреймах, тогда обновляй фрейм например со списком юзеров и проверяй какой из юзеров присутствует (не пишет сообщений а именно присутствует) если он отсутствует скажем 10 сек он удаляется

И вобще почитай тему может чё поможет
http://forum.vingrad.ru/index.php?showtopic=66829&hl=
там этот вопрос и обсуждался как раз

Я думаю автор знает об этом способе.

Автор: patt 24.11.2005, 19:24
Ещё вариант - хранить идентификатор пользователя и время последнего обращения в имени файла - снимает проблему одновременного обращения к файлу нескольких юзеров, или нарузку с БД......

Вообщем вот:

Код

<?
session_id($_GET['sid']);
session_start();

if ($handle = opendir('./online'))
{
    $flagok = false;
    while (false !== ($file = readdir($handle)))
    {
    list($user,$time) = split('<s>',chop($file));
    if($user == "." || $user == "..") continue;
    if($user == $_SESSION['login'])
    {
        rename('./online/'.$file,'./online/'.$user."<s>".time());
        $flagok = true;
    }
    else
    {
        if(time() - $time > 10) unlink('./online/'.$file);
    }
    }
    
    //that string restore on-line status if in consequence of error it was failed
    if(!$flagok){fopen("./online/".$_SESSION['login']."<s>".time(), "w");}
    
    closedir($handle);
    $handle = opendir('./online');
    while (false !== ($file = readdir($handle)))
    {
    list($user,$time) = split('<s>',chop($file));
    if($user == "." || $user == "..") continue;
    if($user == $_SESSION['login'])
    {
        echo $user." -- etoya<br>";
    }
    else
    {
        echo "<a href='javascript:parent.add.sett(\"$user\")'>[priv]</a>
        <a href='javascript:parent.add.sett1(\"$user\")'>".$user."</a>  
        <a href='userinfo.php?login=$user' target=_blank>info</a><br>";
    }
    }
    closedir($handle);
}
echo "<script>setTimeout('location.reload(true)',7000)</script>";

?>

Автор: Elfet 24.11.2005, 19:37
patt, а это точно нагрузку снимает? smile

Автор: Mal Hack 24.11.2005, 20:14
Цитата(Elfet @ 24.11.2005, 19:37)
patt, а это точно нагрузку снимает? smile

Зато нагружка на сервак будет... Причем не факт, что меньшая.

Автор: patt 24.11.2005, 21:20
Цитата(Elfet @ 24.11.2005, 19:37)
patt, а это точно нагрузку снимает? smile

Ну если БД не используется........... да я думаю снимает smile

А в целом, я думаю нагрузка на сервак то же не больше....... если навскидку прикинуть: имена файлов хранятся в таблице, в первых секторах диска, тоесть при поиске сканируется неприрывная область памяти, а при работе с самими файлами или БД, делается то же самое, только при нахождении файла с данным именем идёт переход по физическому адресу, а потом уже работа с данными..... Файл к тому же может быть фрагментирован... Но это всё фигня, тут главное, что нет совместного доступа к файлу (может только во время удаления, но пока проблем небыло......... smile )

Автор: Neitron 25.11.2005, 13:42
Цитата(patt @ 24.11.2005, 21:20)
Цитата(Elfet @ 24.11.2005, 19:37)
patt, а это точно нагрузку снимает? smile

Ну если БД не используется........... да я думаю снимает smile

А в целом, я думаю нагрузка на сервак то же не больше....... если навскидку прикинуть: имена файлов хранятся в таблице, в первых секторах диска, тоесть при поиске сканируется неприрывная область памяти, а при работе с самими файлами или БД, делается то же самое, только при нахождении файла с данным именем идёт переход по физическому адресу, а потом уже работа с данными..... Файл к тому же может быть фрагментирован... Но это всё фигня, тут главное, что нет совместного доступа к файлу (может только во время удаления, но пока проблем небыло......... smile )

И откудж ети знаешь как работает и ищет данные БД?smile
Уверяю что ты неправ.

Автор: Сириус 26.11.2005, 20:38
Спасибо всем за ответы!
Куксикус ты можешь обьяснить мне каким образом я могу узнать данный юзер тут или не тут?
Это был бы конечно же лучший вариант, но не знаю как..

Автор: Diesel Draft 27.11.2005, 00:46
Короче. Здесь много написали. Потому я всього читать не буду то му извините если я кого нибуть повторю


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

Автор: Сириус 27.11.2005, 01:28
Хм..не понял

Автор: patt 28.11.2005, 22:29
Цитата(Neitron @ 25.11.2005, 13:42)
Цитата(patt @ 24.11.2005, 21:20)
Цитата(Elfet @ 24.11.2005, )
patt, а это точно нагрузку снимает? smile

Ну если БД не используется........... да я думаю снимает smile

А в целом, я думаю нагрузка на сервак то же не больше....... если навскидку прикинуть: имена файлов хранятся в таблице, в первых секторах диска, тоесть при поиске сканируется неприрывная область памяти, а при работе с самими файлами или БД, делается то же самое, только при нахождении файла с данным именем идёт переход по физическому адресу, а потом уже работа с данными..... Файл к тому же может быть фрагментирован... Но это всё фигня, тут главное, что нет совместного доступа к файлу (может только во время удаления, но пока проблем небыло......... smile )

И откудж ети знаешь как работает и ищет данные БД?smile
Уверяю что ты неправ.

MySQL хранит свои данные в обычных файлах, и ессесно работает с ними средствами ОС....

Автор: Mal Hack 28.11.2005, 22:40
Цитата(patt @ 28.11.2005, 22:29)
MySQL хранит свои данные в обычных файлах, и ессесно работает с ними средствами ОС....

Все всегда хранистся в файлах. Не забывай, что Мискул мнгое в памяти держит.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)