Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Long polling новые сообщения
Форумы портала PHP.SU » » Вопросы новичков » Long polling новые сообщения

Страниц (1): [1]
 

1. RageXL - 15 Апреля, 2014 - 00:07:20 - перейти к сообщению
Помогите пожалуйста правильно сделать уведомление о новых сообщения для пользователей, используя Long polling. Сам я в этой технологии не силен.

Что есть на данный момент

Клиент:

CODE (javascript):
скопировать код в буфер обмена
  1.  function getmess(){
  2.     $.ajax({
  3.     url:"notif.php",
  4.     data:{"id":id},
  5.     type:"GET",
  6.     success:function(result){
  7.         $("#count").html(result);
  8.         setTimeout('getmess',10000);
  9.       }
  10.      });
  11.     }


Обработчик notif.php

PHP:
скопировать код в буфер обмена
  1.  $mysqli = new mysqli('localhost', 'root', '', 'test');
  2.         if (mysqli_connect_errno()) {
  3.         printf("error: %s\n", mysqli_connect_error());
  4.         exit;
  5.         }  
  6.  
  7.      session_start();
  8.  
  9.     $MY_ID = $_SESSION['id'];
  10.  
  11.     while (true) {
  12.     $result = $mysqli->query("SELECT COUNT(*) FROM messages WHERE user_get='$MY_ID' AND status='1' ");
  13.     if (mysqli_num_rows($result)) {
  14.     while ($row = mysqli_fetch_array($result)) {
  15.     echo $row[0]."";
  16.     }
  17.     flush();
  18.     exit;
  19.     }
  20.     sleep(5);
  21.     }


Проблема в том что когда приходит новое сообщение блок count не обновляется, если повесить событие onclick="getmess();" на кнопку, то при нажатии на нее счетчик обновляется, но мне нужно чтобы он обновлялся сразу как приходит новое сообщение.
2. LIME - 15 Апреля, 2014 - 00:12:48 - перейти к сообщению
http://techoctave[dot]com/c7/posts/6[dot][dot][dot]cript-and-jquery
3. RageXL - 15 Апреля, 2014 - 01:00:11 - перейти к сообщению
LIME пишет:
http://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery


Можете пожалуйста объяснить на моем примере ?
4. Panoptik - 15 Апреля, 2014 - 01:20:34 - перейти к сообщению
просто замените ваш вызов на это
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. (function getmess(){
  3.     $.ajax({
  4.       url:"notif.php",
  5.       data:{"id":id},
  6.       type:"GET",
  7.       success: function(result){
  8.         $("#count").html(result);
  9.       }, dataType: "json",
  10.       complete: getmess,
  11.       timeout: 10000});
  12. })();
  13.  

(Добавление)
обратите внимание функция вызывается сама и не нужно гдето дополнительно делать ее явный вызов
5. RageXL - 15 Апреля, 2014 - 01:27:05 - перейти к сообщению
[quote=Panoptik]просто замените ваш вызов на это
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. (function getmess(){
  3.     $.ajax({
  4.       url:"notif.php",
  5.       data:{"id":id},
  6.       type:"GET",
  7.       success: function(result){
  8.         $("#count").html(result);
  9.       }, dataType: "json",
  10.       complete: getmess,
  11.       timeout: 10000});
  12. })();
  13.  


Так работает. А то, что запросы отсылаются каждую секунду это нормально ? Не создается ли при этом нагрузка на сервер ?
6. Panoptik - 15 Апреля, 2014 - 01:30:53 - перейти к сообщению
в коде написано 10 секунд. нагрузка конечно есть, всё зависит от сложности кода выполняемого в скрипте notif.php
есть конечно другие технологии, в той же статье по ссылке выше рассматривались, вам нужен был лонг пулинг - вот он
лучше конечно таймаут оставлять на около 5 сек не чаще
7. RageXL - 15 Апреля, 2014 - 14:47:26 - перейти к сообщению
Странно по моему функция не реагирует на изменение значения timeout, запросы все равно отсылаются каждую секунду
8. Panoptik - 15 Апреля, 2014 - 16:13:59 - перейти к сообщению
возможно разные версии jquery и были какие-то изменения, посмотрите документацию по jquery ajax
(Добавление)
если что - можно в комплит вместо вызовы ф-ции просто всунуть setTimeout и внутри уже вызов
9. RageXL - 16 Апреля, 2014 - 14:12:54 - перейти к сообщению
Все равно не выходит, запрос должен длится 10 секунд, он длятся 1 секунду затем отсылается следующий.
10. IllusionMH - 16 Апреля, 2014 - 14:16:50 - перейти к сообщению
RageXL, как этот запрос вообще отсылается повторно? Ищите таймер, т.к. timeout не задет интервал повторений запросов, а только интервал через который будет выброшена ошибка превышения времени ожидания.
11. RageXL - 16 Апреля, 2014 - 15:08:18 - перейти к сообщению
У меня на данный момент всего один вопрос. Как добиться того, чтобы длина запроса была не 1 секунду, а 10 ?
12. IllusionMH - 16 Апреля, 2014 - 15:42:15 - перейти к сообщению
RageXLRageXL, запрос заканчивается когда отвечает сервер либо отваливается по таймауту.
Если как спрошено выше у вас есть свой таймер который посылает запросы каждую секунду - ищите его, если у вас сервер отвечает сразу, а не крутиться в цикле ожидая "события" чтобы ответить - правьте сервер.

 

Powered by ExBB FM 1.0 RC1