За последние 24 часа нас посетили 17823 программиста и 1688 роботов. Сейчас ищут 959 программистов ...

Long polling обновление счетчика новых сообщений

Тема в разделе "JavaScript и AJAX", создана пользователем RageXL, 10 апр 2014.

  1. RageXL

    RageXL Новичок

    С нами с:
    14 авг 2013
    Сообщения:
    31
    Симпатии:
    0
    В общем задача такая: на странице есть блок <div> в котором выводится число всех полученных сообщений из таблицы messages для конкретного пользователя.

    Код (Text):
    1. $result = $mysqli->query("SELECT COUNT(*) FROM messages WHERE user_get='$my_id'");
    2.     $row = $result->fetch_row();
    3.     $totalm = $row[0]; // количество сообщений
    4. $result->close();
    Сама таблица:

    id | user_send | user_get | text | time

    Мне нужно чтобы при поступлении нового сообщения для данного пользователя в базу, этот блок обновлялся, т.е. показывал новое число сообщений.
    Для этого я как понимаю используют long-polling, потому как просто обновлять данный блок через заданный интервал времени затратно по ресурсам при большом количестве пользователей.
    В интернете не нашел подходящих примеров, а сам лично не очень знаком с данной технологией. Буду очень благодарен если кто нибудь покажет на примере как это реализовать.
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Если кратко, то надо просто не отвечать на запрос клиента до тех пор, пока не появится, что ответить. А когда ответили, клиент должен принять ответ и снова отослать запрос.

    Если подробнее, то вот http://habrahabr.ru/post/128535/ 2011 год, правда, но суть не сильно изменилась с тех времен.
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Какой онлайн предполагается?
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А это самый крутой вопрос ever.

    Коммент с той же статьи:
    ИМХО, лучше аяксик раз в 5-10 секунд на сервер закидывать. Чай не мессенджер разрабатывается. Это создает нагрузку в среднем гораздо меньшую, чем сам пользователь.
     
  5. RageXL

    RageXL Новичок

    С нами с:
    14 авг 2013
    Сообщения:
    31
    Симпатии:
    0
    Long polling количество новых сообщений

    клиент
    Код (Text):
    1. var id = '<?=$MY_ID;?>';
    2. (function getmess(){
    3.     $.ajax({
    4.       url:"notif.php",
    5.       data:{"id":id},
    6.       type:"POST",
    7.       success: function(result){
    8.         $("#count").html(result);
    9.       }, dataType: "json",
    10.       complete: getmess,
    11.       timeout: 10000});
    12. })();

    сервер:
    Код (Text):
    1. $mysqli = new mysqli('localhost', 'root', '', 'lc');
    2.     if (mysqli_connect_errno()) {
    3.         printf("Подключение к серверу MySQL невозможно. Код ошибки: %s\n", mysqli_connect_error());
    4.         exit;
    5.     }  
    6.    
    7.  
    8. $MY_ID = $_POST['id'];
    9.  
    10. while (true) {
    11. $result = $mysqli->query("SELECT COUNT(*) FROM messages WHERE user_get='$MY_ID' AND status='1' ");
    12. if (mysqli_num_rows($result)) {
    13. while ($row = mysqli_fetch_array($result)) {
    14. echo $row[0];
    15. }
    16. exit;
    17. }
    18. sleep(10);
    19. }
    Проблема в том, что соединение не остается открытым например 10 секунд, как того предполагает Long-polling, вместо этого запросы отсылаются каждую секунду. Я уже все перепробовал - не могу победить эту проблему.