
![]() |
Здравствуйте Гость ( Вход | Регистрация ) |
|
|
|
![]() ![]() ![]() |
![]() |
|
![]() Новичок ![]() Профиль Группа: Пользователь Сообщений: 6 Пользователь №: 40687 На форуме: Карма: ![]() |
Всем доброго времени суток :)
Решил написать сюда, поскольку дэдлайн близок, нервы на пределе, а я оставил клиентскую часть проекта "на потом", как самое легкое (похоже, я жестоко ошибся). Пытаюсь реализовать механизм 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() { В чем моя ошибка? Может кто-то сталкивался в своей практике с такой проблемой? Буду очень благодарен за ответ. P.S. проблема точно не в сервере, поскольку с другого браузера сайт открывается. Это сообщение отредактировал Catzilla - 3.02.2015 - 21:33 |
![]() |
|||||||
![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 753 Пользователь №: 32032 На форуме: Карма: 18 ![]() |
Comet и Ajax, не одно и тоже. http://stackoverflow.com/questions/2975290...vs-ajax-polling http://api.jquery.com/jquery.ajax/
Дело не в том, что "пока открыто соединение", а в том, что пока не будет ответа от сервера на ajax запрос, браузер подвисает в ожидании. Остальное видимо не просто делается, чтобы просто исправить. Кросдоменные запросы нужно гуглить. |
||||||
![]() |
|
![]() ![]() Сидел он, дум великих полон - и вдаль глядел ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Эксперт ![]() Сообщений: 15860 Пользователь №: 4190 На форуме: Карма: 490 ![]() |
Ты используешь сессию? При открытой сессии такое поведение как раз нормально. Потому что первый запрос открывает сессионный файл, второй запрос ждет, пока файл не освободится. Или пока не закончится тайм-аут.
Если проблема именно в этом, то тогда сессию надо в первом запрос закрывать сразу же, как нужные данные оттуда считаны. Если сессии тут нет, то тогда будем дальше думать. -------------------- * Хэлп по PHP
* Описалово по JavaScript * Хэлп и СУБД для PostgreSQL * Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. * "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С) ![]() |
![]() |
۩
Дата
|
||
![]() Новичок ![]() Профиль Группа: Пользователь Сообщений: 6 Пользователь №: 40687 На форуме: Карма: ![]() |
Да, сессия используется, но только на *.widget.local.host. А перестает грузиться любой адрес сайта (даже корневой local.host). Кроме того, виджет не инициирует запросов без предварительных действий пользователя, так что не должно так влиять, по идее. Для теста только что убрал сессию, ничего не изменилось ![]() Это сообщение отредактировал Catzilla - 4.02.2015 - 01:38 |
||
![]() |
|||
![]() ![]() Сидел он, дум великих полон - и вдаль глядел ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Эксперт ![]() Сообщений: 15860 Пользователь №: 4190 На форуме: Карма: 490 ![]() |
То есть, не открываешь сессию вообще нигде, ни в одном скрипте? -------------------- * Хэлп по PHP
* Описалово по JavaScript * Хэлп и СУБД для PostgreSQL * Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. * "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С) ![]() |
||
![]() |
|||
![]() Новичок ![]() Профиль Группа: Пользователь Сообщений: 6 Пользователь №: 40687 На форуме: Карма: ![]() |
Да, не открываю нигде. UPD: Проблема решилась! Кроме отключения сессии, вернул всё обратно, в один домен, и о чудо, завелось! Похоже, совет из гугла о пулинге на субдомен был вредным ![]() Теперь влепил session_write_close() в файл пулинга, работает замечательно. sergeiss, Спасибо огромное, вы спасли мои нервы ![]() Век живи, век учись - теперь буду знать эту тонкость ![]() Это сообщение отредактировал Catzilla - 4.02.2015 - 02:58 |
||
![]() |
|||
![]() ![]() Сидел он, дум великих полон - и вдаль глядел ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Эксперт ![]() Сообщений: 15860 Пользователь №: 4190 На форуме: Карма: 490 ![]() |
Скажи "по секрету", многие по этим граблям попрыгали. И я тоже как-то на них наступил. -------------------- * Хэлп по PHP
* Описалово по JavaScript * Хэлп и СУБД для PostgreSQL * Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. * "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С) ![]() |
||
![]() |
|||
![]() ![]() int main(){printf("Hello World"); return 0;"} ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 2490 Пользователь №: 20247 На форуме: Карма: 63 ![]() |
Или перенести хранение сессий в какое-нить не блокирующее хранилище, типа того же рэдиса\мемкеша, что во многих случаях должно бы быть предпочтительнее, чем закрывать сессию посреди работы. -------------------- "Нужно быть готовым прислушиваться к тем, кто может тебя чему-нибудь научить. Иначе ты никогда не вырастешь."
Откровенно я никому ниразу не нагрубил. А дать подзатыльник зарвавшемуся юнцу, так это и ему на пользу, и мне в удовольствие. © AllesKlar |
||
![]() |
|
![]() ![]() орангутанг ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 2120 Пользователь №: 36605 На форуме: Карма: 115 ![]() |
vital тут как раз норм решение, прочитал закрыл и пофиг, если там нет ничего того что должно туда писать
|
![]() |
|||||
![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 753 Пользователь №: 32032 На форуме: Карма: 18 ![]() |
Тут я ошибся в сравнении. Почему-то считал, что Comet - это такой же подход к построению интерактивных приложений как и Ajax. Практически не использовал Comet, а где-то вычитал. Википедия
Поэтому когда увидел в коде Ajax, а в названии темы Comet подумал что изначально выбран неверный подход и проблема была в синхронности/асинхронности Ajax запросов. Получается, что Long-Polling заключается в функции LongPool(), которая использует Ajax подход и на успешный ответ на ajax запрос вызывает сама себя (рекурсивно), а Comet можно назвать всё приложение в т.ч. и серверную часть. |
||||
![]() |
![]() ![]() ![]() |