Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Длительные опросы. Подвисание, (https://javascript.ru/forum/misc/20953-dlitelnye-oprosy-podvisanie.html)

nyols 23.08.2011 21:46

Длительные опросы. Подвисание,
 
Для обновления сообщений чата, использую "Длинные опросы (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 секунд то он прекращает работу как надо) и после получения ответа я через пол секунды отправляю еще раз запрос.


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

devote 23.08.2011 22:38

Цитата:

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

Браузер ждет ответа от сервера, поэтому и происходит ожидание.

Kolyaj 23.08.2011 22:55

Это в каком-то одном браузере или во всех?

devote 23.08.2011 23:00

Цитата:

Сообщение от Kolyaj
Это в каком-то одном браузере или во всех?

Я уверен что во всех, он останавливает скрипт PHP на 20 секунд до его завершения, понятно дело браузер ожидает ответа от сервера, а вместо того что бы браузеру что-то отдать, скрипт анонизмом занимается, устраивая паузы.

devote 23.08.2011 23:04

nyols, если хочешь сделать нормальный чат, пиши демона на стороне сервера, и соединяйся с ним посредством сокетов, и не будет тормозов и будет мгновенное уведомление от сервера. а PHP через апач не будет полноценным демоном.

devote 23.08.2011 23:07

если у тебя есть доступ к серверу, демона можно написать так же и на PHP но без апача используя pcntl_fork(); а так это все полная хрень, не вешай скрипт PHP и не будет браузер думать.

Kolyaj 23.08.2011 23:39

Цитата:

Сообщение от devote
Я уверен что во всех

А я подозреваю, что только в ИЕ, но хочется убедиться.

nyols 24.08.2011 10:16

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

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

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



Цитата:

Сообщение от devote
Я уверен что во всех, он останавливает скрипт PHP на 20 секунд до его завершения, понятно дело браузер ожидает ответа от сервера, а вместо того что бы браузеру что-то отдать, скрипт анонизмом занимается, устраивая паузы.

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

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

nyols 24.08.2011 17:03

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

Цитата:

Сообщение от devote
Браузер ждет ответа от сервера, поэтому и происходит ожидание.

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

devote 24.08.2011 19:00

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


Часовой пояс GMT +3, время: 12:10.