Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Long Polling / Comet, Блокируются параллельные запросы
Catzilla  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 6
Пользователь №: 40687
На форуме: 10 лет, 2 месяца, 25 дней
Карма:




Всем доброго времени суток :)
Решил написать сюда, поскольку дэдлайн близок, нервы на пределе, а я оставил клиентскую часть проекта "на потом", как самое легкое (похоже, я жестоко ошибся).

Пытаюсь реализовать механизм Long-Poll запросов.

Суть проблемы: при выполнении длинного запроса, пока открыто соединение, браузер не выполняет других запросов к сайту проекта (как бы подвисает).
Таким образом, когда открыто соединение от встраиваемого виджета, невозможно открыть основной сайт проекта в том же браузере.

Сутки гугления помогли найти лишь беглое упоминание, что для решения этой проблемы нужно выполнять Long-Poll запросы к субдомену (чтобы обойти ограничения браузеров).

Сделал следующим образом:
local.host - основной сайт
widget.local.host - тело iframe, встроенного в основной сайт (виджет)
poll1.widget.local.host - сюда отправляются Long-Poll запросы с помощью скрипта, загруженного в iframe

Однако, это не помогло - основной сайт по прежнему виснет при попытке открыть его во время активного запроса.

Также пробовал различные технологии выполнения запросов - CORS (Cross-Origin-Resourse-Sharihg), JSONP. Никаких изменений.

Код "отправлятеля", вариант с JSONP (jquery)
Свернутый текст
function LongPool() {
$.ajax({
url: "http://pool1.widget.local.host/api/pool_client?tid=" + TicketID + "&lid=" + LastID + "&callback=?"),
dataType: 'jsonp',
async: true,
cache: false,
success: function (data) {
if (typeof (data.error) !== "undefined") {
console.log("PRO.Widget.Pool: Server returned error: \"" + data.error + "\"");
return;
}
if (typeof (data.result) !== "undefined") {
if (typeof (data.result.messages) !== "undefined") {
$.each(data.result.messages, function (i, message) {
LastID = message.ID;
alert(i + " : " + message.Body);
});
}
}

LongPool();
},
error: function () {
alert("error");
}
}
);
}


В чем моя ошибка?
Может кто-то сталкивался в своей практике с такой проблемой?
Буду очень благодарен за ответ.

P.S. проблема точно не в сервере, поскольку с другого браузера сайт открывается.

Это сообщение отредактировал Catzilla - 3.02.2015 - 21:33
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
OleKh  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 753
Пользователь №: 32032
На форуме: 12 лет, 11 месяцев, 16 дней
Карма: 18




Цитата
async (default: true)
Type: Boolean
By default, all requests are sent asynchronously (i.e. this is set to true by default). If you need synchronous requests, set this option to false. Cross-domain requests and dataType: "jsonp" requests do not support synchronous operation. Note that synchronous requests may temporarily lock the browser, disabling any actions while the request is active. As of jQuery 1.8, the use of async: false with jqXHR ($.Deferred) is deprecated; you must use the success/error/complete callback options instead of the corresponding methods of the jqXHR object such as jqXHR.done() or the deprecated jqXHR.success().



Цитата
crossDomain (default: false for same-domain requests, true for cross-domain requests)
Type: Boolean
If you wish to force a crossDomain request (such as JSONP) on the same domain, set the value of crossDomain to true. This allows, for example, server-side redirection to another domain. (version added: 1.5)


Цитата (Catzilla @ 3.02.2015 - 19:14)
Суть проблемы: при выполнении длинного запроса, пока открыто соединение, браузер не выполняет других запросов к сайту проекта (как бы подвисает).
Таким образом, когда открыто соединение от встраиваемого виджета, невозможно открыть основной сайт проекта в том же браузере.


Дело не в том, что "пока открыто соединение", а в том, что пока не будет ответа от сервера на ajax запрос, браузер подвисает в ожидании. Остальное видимо не просто делается, чтобы просто исправить. Кросдоменные запросы нужно гуглить.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15860
Пользователь №: 4190
На форуме: 17 лет, 1 месяц, 14 дней
Карма: 490




Ты используешь сессию? При открытой сессии такое поведение как раз нормально. Потому что первый запрос открывает сессионный файл, второй запрос ждет, пока файл не освободится. Или пока не закончится тайм-аут.
Если проблема именно в этом, то тогда сессию надо в первом запрос закрывать сразу же, как нужные данные оттуда считаны.
Если сессии тут нет, то тогда будем дальше думать.


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Catzilla  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 6
Пользователь №: 40687
На форуме: 10 лет, 2 месяца, 25 дней
Карма:




Цитата (sergeiss @ 4.02.2015 - 00:37)
Ты используешь сессию?

Да, сессия используется, но только на *.widget.local.host.
А перестает грузиться любой адрес сайта (даже корневой local.host).
Кроме того, виджет не инициирует запросов без предварительных действий пользователя, так что не должно так влиять, по идее.

Для теста только что убрал сессию, ничего не изменилось sad.gif

Это сообщение отредактировал Catzilla - 4.02.2015 - 01:38
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15860
Пользователь №: 4190
На форуме: 17 лет, 1 месяц, 14 дней
Карма: 490




Цитата (Catzilla @ 4.02.2015 - 01:38)
Для теста только что убрал сессию

То есть, не открываешь сессию вообще нигде, ни в одном скрипте?


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Catzilla  
 ۩     Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 6
Пользователь №: 40687
На форуме: 10 лет, 2 месяца, 25 дней
Карма:




Цитата (sergeiss @ 4.02.2015 - 02:20)
То есть, не открываешь сессию вообще нигде, ни в одном скрипте?

Да, не открываю нигде.

UPD: Проблема решилась!
Кроме отключения сессии, вернул всё обратно, в один домен, и о чудо, завелось!
Похоже, совет из гугла о пулинге на субдомен был вредным biggrin.gif

Теперь влепил session_write_close() в файл пулинга, работает замечательно.

sergeiss, Спасибо огромное, вы спасли мои нервы rolleyes.gif
Век живи, век учись - теперь буду знать эту тонкость smile.gif

Это сообщение отредактировал Catzilla - 4.02.2015 - 02:58
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15860
Пользователь №: 4190
На форуме: 17 лет, 1 месяц, 14 дней
Карма: 490




Цитата (Catzilla @ 4.02.2015 - 02:34)
Век живи, век учись - теперь буду знать эту тонкость

Скажи "по секрету", многие по этим граблям попрыгали. И я тоже как-то на них наступил.


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
vital  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



int main(){printf("Hello World"); return 0;"}
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2490
Пользователь №: 20247
На форуме: 15 лет, 2 месяца, 27 дней
Карма: 63




Цитата
Потому что пeрвый запрос открывает сессионный файл, второй запрос ждет, пока файл не освободится.

Или перенести хранение сессий в какое-нить не блокирующее хранилище, типа того же рэдиса\мемкеша, что во многих случаях должно бы быть предпочтительнее, чем закрывать сессию посреди работы.


--------------------
"Нужно быть готовым прислушиваться к тем, кто может тебя чему-нибудь научить. Иначе ты никогда не вырастешь."

Откровенно я никому ниразу не нагрубил. А дать подзатыльник зарвавшемуся юнцу, так это и ему на пользу, и мне в удовольствие. © AllesKlar
PMПисьмо на e-mail пользователюСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
bestxp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



орангутанг
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2120
Пользователь №: 36605
На форуме: 12 лет, 1 месяц, 4 дня
Карма: 115




vital тут как раз норм решение, прочитал закрыл и пофиг, если там нет ничего того что должно туда писать
PMПисьмо на e-mail пользователюСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
OleKh  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 753
Пользователь №: 32032
На форуме: 12 лет, 11 месяцев, 16 дней
Карма: 18




Цитата (OleKh @ 3.02.2015 - 20:44)
Comet и Ajax, не одно и тоже.

Тут я ошибся в сравнении. Почему-то считал, что Comet - это такой же подход к построению интерактивных приложений как и Ajax. Практически не использовал Comet, а где-то вычитал.

Википедия
Цитата
Однако на практике приложения Comet обычно используют Ajax c long polling для проверки наличия новой информации на сервере.


Поэтому когда увидел в коде Ajax, а в названии темы Comet подумал что изначально выбран неверный подход и проблема была в синхронности/асинхронности Ajax запросов.

Получается, что Long-Polling заключается в функции LongPool(), которая использует Ajax подход и на успешный ответ на ajax запрос вызывает сама себя (рекурсивно), а Comet можно назвать всё приложение в т.ч. и серверную часть.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса