Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.08.2011, 21:46
Кандидат Javascript-наук
Отправить личное сообщение для nyols Посмотреть профиль Найти все сообщения от nyols
 
Регистрация: 16.02.2011
Сообщений: 134

Длительные опросы. Подвисание,
Для обновления сообщений чата, использую "Длинные опросы (long poll)". Все работает как надо и сообщения обновляются. Но проблема в том что, когда пытаешься обновить страницу (F5) то ожидание ответа от сервера длится около 10-20 секунд. Если же перейти на другую страницу (где нет чата) то она тоже долго грузится, но последующие страницы уже нормально. Если вернутся обратно на страницу с чатом, то опять все долго при обновлениях.
Если же не использовать длинные опросы. А просто:
Отправить запрос - получить ответ (обработать ответ) - через пару секунд опять отправть и т.д. То все нормально.

Задержку на сервере делаю так:
$time = time();
while(true) {
   // Тут получаю данные.
   if (count($messages) < 1 && time()-$time < 20)
      sleep(2);
   else
      break;
   // Если есть хоть одно сообщение или скрипт работает уже больше 20 секунд, то прерываю его работу, иначе останавливаю работу скрипта на 2 секунды, и по новой.
}
echo json_encode($messages);

Хочу еще раз обратить внимание, что в скрипте все в порядке (если появляется сообщение или прошло 20 секунд то он прекращает работу как надо) и после получения ответа я через пол секунды отправляю еще раз запрос.


В чем же может быть причина что подвисает загрузка страниц ?

Последний раз редактировалось nyols, 23.08.2011 в 21:55.
Ответить с цитированием
  #2 (permalink)  
Старый 23.08.2011, 22:38
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от nyols
В чем же может быть причина что подвисает загрузка страниц ?
Браузер ждет ответа от сервера, поэтому и происходит ожидание.

Последний раз редактировалось devote, 23.08.2011 в 22:40.
Ответить с цитированием
  #3 (permalink)  
Старый 23.08.2011, 22:55
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Это в каком-то одном браузере или во всех?
Ответить с цитированием
  #4 (permalink)  
Старый 23.08.2011, 23:00
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Kolyaj
Это в каком-то одном браузере или во всех?
Я уверен что во всех, он останавливает скрипт PHP на 20 секунд до его завершения, понятно дело браузер ожидает ответа от сервера, а вместо того что бы браузеру что-то отдать, скрипт анонизмом занимается, устраивая паузы.
Ответить с цитированием
  #5 (permalink)  
Старый 23.08.2011, 23:04
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

nyols, если хочешь сделать нормальный чат, пиши демона на стороне сервера, и соединяйся с ним посредством сокетов, и не будет тормозов и будет мгновенное уведомление от сервера. а PHP через апач не будет полноценным демоном.
Ответить с цитированием
  #6 (permalink)  
Старый 23.08.2011, 23:07
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

если у тебя есть доступ к серверу, демона можно написать так же и на PHP но без апача используя pcntl_fork(); а так это все полная хрень, не вешай скрипт PHP и не будет браузер думать.
Ответить с цитированием
  #7 (permalink)  
Старый 23.08.2011, 23:39
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от devote
Я уверен что во всех
А я подозреваю, что только в ИЕ, но хочется убедиться.
Ответить с цитированием
  #8 (permalink)  
Старый 24.08.2011, 10:16
Кандидат Javascript-наук
Отправить личное сообщение для nyols Посмотреть профиль Найти все сообщения от nyols
 
Регистрация: 16.02.2011
Сообщений: 134

Смотрел пока что только в Google Chrome. Приду на работу посмотрю в FF и IE.

Вообще по сути для меня это не критичная проблема. Обойдусь и простыми аякс запросам. Делать демона на сервере нет смысла, так так у меня не то что бы чат (так сказал что бы понятнее было). Это как онлайн служба поддержки, просто обмен сообщениями между клиентом и администратором.

Просто как говорится, факт остается фактом. И хочется узнать причину. Так сказать интереса ради.



Сообщение от devote
Я уверен что во всех, он останавливает скрипт PHP на 20 секунд до его завершения, понятно дело браузер ожидает ответа от сервера, а вместо того что бы браузеру что-то отдать, скрипт анонизмом занимается, устраивая паузы.
Не очень понял))
Я думал что браузер так долго ожидает ответа потому что потому что когда перезагружаю страницу то висит еще активное соединение сделанное аяксом. Но смотрел в файрбаге, при обновление страницы срабатывает abort то есть прерывается соединение (и другой запрос не отправляется). А значит с соединениями все в порядке.

А причина может быть в самом сервере ? если да то как узнать ?

Последний раз редактировалось nyols, 24.08.2011 в 10:35.
Ответить с цитированием
  #9 (permalink)  
Старый 24.08.2011, 17:03
Кандидат Javascript-наук
Отправить личное сообщение для nyols Посмотреть профиль Найти все сообщения от nyols
 
Регистрация: 16.02.2011
Сообщений: 134

Да, в FF и IE та же история.

Сообщение от devote
Браузер ждет ответа от сервера, поэтому и происходит ожидание.
Но какого ответа он ждет так долго ? и главное это только после посещения страницы с чатом (после того как начинают отправляться эти самые запросы).
Может аякс запрос прерывается а скрипт на сервере все равно выполняется ? Хотя вроде настройки на подобное не меняли.

Последний раз редактировалось nyols, 24.08.2011 в 17:08.
Ответить с цитированием
  #10 (permalink)  
Старый 24.08.2011, 19:00
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

А ты попробуй уменьшить время задержки в PHP скрипте, и увидешь что станет меньше ждать... а то что FF показал команду аборт, это еще ни о чем не говорит
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подвисание браузера vvo Серверные языки и технологии 6 18.11.2010 09:02
Подвисание IE при динамическом изменении контента Taddy_Bear Общие вопросы Javascript 4 11.12.2008 21:12