За последние 24 часа нас посетили 8785 программистов и 474 робота. Сейчас ищут 200 программистов ...

Прогрессивное обновление в чате

Тема в разделе "Прочие вопросы по PHP", создана пользователем serghacker, 5 фев 2006.

  1. serghacker

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

    С нами с:
    5 фев 2006
    Сообщения:
    4
    Симпатии:
    0
    Кто как реализует прогрессивное обновление.... поделитесь секретами
     
  2. 440Hz

    440Hz Активный пользователь
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ой! а что это такое? 8)
     
  3. wolandino

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

    С нами с:
    5 фев 2006
    Сообщения:
    193
    Симпатии:
    0
    Адрес:
    Россия, Астрахань
    пусть долбят F5 :D
     
  4. Kolo

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

    С нами с:
    3 фев 2006
    Сообщения:
    51
    Симпатии:
    0
    Адрес:
    SPb
    Походу имеется в виду безрефрешевый чат.
    Я знаю два способа:

    1. Бесконечный цикл с flush()'ем. Плохая штука, делает очень большую нагрузку на сервер.
    2. Незаметная подгрузка скрипта/iфрейма, что-то вроде этого.
     
  5. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.041
    Симпатии:
    29
    Адрес:
    Estonia, Tallinn
    Нафик фреймы и тем более flush() гараздо проще сделать всё на JavaScript (читаем журнал рнрклуба про Ajax с помошью createElement и радуемся)
     
  6. serghacker

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

    С нами с:
    5 фев 2006
    Сообщения:
    4
    Симпатии:
    0
    Я лично юзаю скрипт который проверяет БД на наличие доп. сообщений и если они есть то происходит обновление фрейма при помощи JS. Ток вот сомневаюсь в полной безопасности данного способа
     
  7. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.041
    Симпатии:
    29
    Адрес:
    Estonia, Tallinn
    Безопасность зависит не от метода а от того кто его реализвал !!!
     
  8. wolandino

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

    С нами с:
    5 фев 2006
    Сообщения:
    193
    Симпатии:
    0
    Адрес:
    Россия, Астрахань
    Хм... а при большой нагрузке, хотя бы в 100 пользователей? Не слишком ли жирно получится?

    Не вижу логики..
     
  9. Бутузов

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

    С нами с:
    5 фев 2006
    Сообщения:
    115
    Симпатии:
    0
    Адрес:
    Київ, Україна
    спокойно выдержит.
     
  10. wolandino

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

    С нами с:
    5 фев 2006
    Сообщения:
    193
    Симпатии:
    0
    Адрес:
    Россия, Астрахань
    я не писал, что не выдержит - я писал, что получается достаточно ресурсозатратно
     
  11. Бутузов

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

    С нами с:
    5 фев 2006
    Сообщения:
    115
    Симпатии:
    0
    Адрес:
    Київ, Україна
    пока не зделали такой проект наш разговор пустая болтовня. выдержит - не выдержит...

    давайте допустим что у нас нет в чате аякса который добавит к существующему окну сообщений новые. у нас обычное обновление (болье громоздкий вариант с посточнным конектом откыдываем сразу так как дял пхп это не гламурно, пхп не перл). так вот вернемся к нашим баранам. имея простое обновление (рефреш страницы) каждые 15 секунд мы имеем такую же нагрузку запрашивая эти же данные аяксом, с той лиш разницей. что
    а) мы генерируем больше трафика. (минус в сторону рефреша плюс аяксу)
    б) мы создаем больше нагрузки на сервер процем той же генераци.
    выбор всего и выбор лишь какойто записи, собственно генерация по шаблону. В случае если данные не в mysql мы упускаем вариацию с выборкой.

    собственно насчет слов - "достаточно ресурсозатратно", ну это смотря
    а) как напишут
    б) на чем напишут
    в) как поставят, где и на чем поставят
    г) как настроят

    грамотно продумать это единственное что имеет значение в данном случає. =)
     
  12. wolandino

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

    С нами с:
    5 фев 2006
    Сообщения:
    193
    Симпатии:
    0
    Адрес:
    Россия, Астрахань
    с этого и нужно начинать :)
    какова бы ни была технология использована, при кривой архитектуре самого приложения - сами понимаете, ничего хорошего не выйдет
     
  13. Бутузов

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

    С нами с:
    5 фев 2006
    Сообщения:
    115
    Симпатии:
    0
    Адрес:
    Київ, Україна
    о! а я про что?
     
  14. serghacker

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

    С нами с:
    5 фев 2006
    Сообщения:
    4
    Симпатии:
    0
    Вот как выглядит у меня фрейм который рефрешит нужные фреймы
    <?
    session_name("chat");
    session_start();
    mysql_connect("localhost", "user", "password") or die("Could not connect");
    mysql_select_db("chat") or die("Could not select database");
    ?>
    <html>
    <head>
    <META HTTP-EQUIV="Refresh" CONTENT="5; URL=./refresh.php">
    <script language="JavaScript">
    function mess(){
    parent.messages.location.href= "./print.php";
    }
    function list(){
    parent.messages.location.href= "./print.php";
    parent.users.location.href= "./list.php";
    }
    </script>
    </head>
    <?
    $user = $chat_user;
    $q = "SELECT * FROM message";
    $res = mysql_query($q) or die("ERROR!!!"); //выбираем все сообщения
    $n = mysql_num_rows($res); //и считаем их кол-во
    $q = "SELECT * FROM users WHERE (status='1')"; //выбираем юзверей
    $res = mysql_query($q) or die("ERROR!!!"); //в онлайн
    $online = mysql_num_rows($res); //и считаем их кол-во
    $q = "SELECT * FROM chat_refresh WHERE (mess<'$n' && user='$user') and (list>'$online' or list<$online) "; //проверяем есть ли
    $res = mysql_query($q) or die("ERROR!!!"); //изменения в кол-ве
    if(mysql_fetch_array($res)){ //пользователей, если есть то
    echo " //обновляем список
    <body onLoad=\"list()\"> //пользователей и сообщений
    ";// т.к. пришло оповещение о приходе/покидании
    $q = "UPDATE chat_refresh SET list='$online' WHERE(user='$user')"; //чата юзверем потом обновляем записи в БД
    mysql_query($q) or die("ERROR!!!");
    $q = "UPDATE chat_refresh SET mess='$n' WHERE(user='$user')";
    mysql_query($q) or die("ERROR!!!");
    }

    else {
    $q = "SELECT * FROM chat_refresh WHERE (mess<$n) and (user='$user')"; //проверяем наличие новых сообщений
    $res = mysql_query($q) or die("ERROR!!!");
    if(mysql_fetch_array($res)){
    echo "
    <body onLoad=\"mess()\"> // если есть обновляем
    ";
    $q = "UPDATE chat_refresh SET mess='$n' WHERE(user='$user')";
    mysql_query($q) or die("ERROR!!!"); //не забываем про БД
    }
    }
    ?>
    </body>
    </html>


    P.s. Сильно не пинать... начинающий всё-таки
     
  15. Бутузов

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

    С нами с:
    5 фев 2006
    Сообщения:
    115
    Симпатии:
    0
    Адрес:
    Київ, Україна
    часть кода можно упроситить до безобразия

    к примеру
    $q = "SELECT * FROM message";
    и его парсинг меняем на
    $q = "SELECT count(*) as total FROM message";

    потму как имея к примеру 200000 записей создаем ну не просто не нужную нагрузку а супер никомунежную нагрузку.

    авторайз юзера кидай всесию, и отуда уже используй его ид.

    за апдейт руки отрезать надо. не safe sql injection решение это точно...


    --------
    это я не сильно пинал ;-)
     
  16. serghacker

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

    С нами с:
    5 фев 2006
    Сообщения:
    4
    Симпатии:
    0
    В sql я плохо разбираюсь (никак нормальную русскую доку не найду в оффлайн варианте...)
    P.S. А геде почитать про инъекции, т.е. про то какие запросы лучше не юзать?
     
  17. wolandino

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

    С нами с:
    5 фев 2006
    Сообщения:
    193
    Симпатии:
    0
    Адрес:
    Россия, Астрахань
  18. Бутузов

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

    С нами с:
    5 фев 2006
    Сообщения:
    115
    Симпатии:
    0
    Адрес:
    Київ, Україна