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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Long polling новые сообщения

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
RageXL
Отправлено: 15 Апреля, 2014 - 00:07:20
Post Id


Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Авг. 2013  


Помог: 0 раз(а)




Помогите пожалуйста правильно сделать уведомление о новых сообщения для пользователей, используя 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();" на кнопку, то при нажатии на нее счетчик обновляется, но мне нужно чтобы он обновлялся сразу как приходит новое сообщение.
 
 Top
LIME
Отправлено: 15 Апреля, 2014 - 00:12:48
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




 
 Top
RageXL
Отправлено: 15 Апреля, 2014 - 01:00:11
Post Id


Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Авг. 2013  


Помог: 0 раз(а)




LIME пишет:
http://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery


Можете пожалуйста объяснить на моем примере ?
 
 Top
Panoptik
Отправлено: 15 Апреля, 2014 - 01:20:34
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




просто замените ваш вызов на это
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.  

(Добавление)
обратите внимание функция вызывается сама и не нужно гдето дополнительно делать ее явный вызов

(Отредактировано автором: 15 Апреля, 2014 - 01:21:36)



-----
Just do it
 
 Top
RageXL
Отправлено: 15 Апреля, 2014 - 01:27:05
Post Id


Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Авг. 2013  


Помог: 0 раз(а)




[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.  


Так работает. А то, что запросы отсылаются каждую секунду это нормально ? Не создается ли при этом нагрузка на сервер ?

(Отредактировано автором: 15 Апреля, 2014 - 01:27:51)

 
 Top
Panoptik
Отправлено: 15 Апреля, 2014 - 01:30:53
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




в коде написано 10 секунд. нагрузка конечно есть, всё зависит от сложности кода выполняемого в скрипте notif.php
есть конечно другие технологии, в той же статье по ссылке выше рассматривались, вам нужен был лонг пулинг - вот он
лучше конечно таймаут оставлять на около 5 сек не чаще


-----
Just do it
 
 Top
RageXL
Отправлено: 15 Апреля, 2014 - 14:47:26
Post Id


Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Авг. 2013  


Помог: 0 раз(а)




Странно по моему функция не реагирует на изменение значения timeout, запросы все равно отсылаются каждую секунду
 
 Top
Panoptik
Отправлено: 15 Апреля, 2014 - 16:13:59
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




возможно разные версии jquery и были какие-то изменения, посмотрите документацию по jquery ajax
(Добавление)
если что - можно в комплит вместо вызовы ф-ции просто всунуть setTimeout и внутри уже вызов


-----
Just do it
 
 Top
RageXL
Отправлено: 16 Апреля, 2014 - 14:12:54
Post Id


Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Авг. 2013  


Помог: 0 раз(а)




Все равно не выходит, запрос должен длится 10 секунд, он длятся 1 секунду затем отсылается следующий.
 
 Top
IllusionMH
Отправлено: 16 Апреля, 2014 - 14:16:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




RageXL, как этот запрос вообще отсылается повторно? Ищите таймер, т.к. timeout не задет интервал повторений запросов, а только интервал через который будет выброшена ошибка превышения времени ожидания.

(Отредактировано автором: 16 Апреля, 2014 - 14:17:28)

 
 Top
RageXL
Отправлено: 16 Апреля, 2014 - 15:08:18
Post Id


Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Авг. 2013  


Помог: 0 раз(а)




У меня на данный момент всего один вопрос. Как добиться того, чтобы длина запроса была не 1 секунду, а 10 ?
 
 Top
IllusionMH
Отправлено: 16 Апреля, 2014 - 15:42:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




RageXLRageXL, запрос заканчивается когда отвечает сервер либо отваливается по таймауту.
Если как спрошено выше у вас есть свой таймер который посылает запросы каждую секунду - ищите его, если у вас сервер отвечает сразу, а не крутиться в цикле ожидая "события" чтобы ответить - правьте сервер.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB