2011-02-01 5 views
0

У нас проблема с длинным опросом и операми. Я сам программист и разработал настроенный http-daemon для наших нужд. В этом случае нам нужен был длинный сервер опроса, который мог бы обрабатывать большое количество соединений.Opera выходит длинный опрос (ы) открыта

Проблема в том, что опера как-то оставляет эти длинные опросы открытыми даже после нажатия на какую-либо ссылку на сайте и, конечно же, открывает новую. Мы используем базовый метод долгого опроса, который пытается включить javascript внутри iframe. Это отлично работает с другими браузерами, но даже если я заставляю предыдущие опросы закрываться на стороне сервера, опера снова открывает их. Это не очень хорошо, потому что на сайте с высоким трафиком лишь немногие операторы могут заставить демона быстро исчерпать свободные дескрипторы файла, просто просматривая сайт (потому что каждый клик на сайте открывает новый длинный опрос, а старые не закрываются). Обновление страницы не вызывает то же самое, оно делает правильно: закройте длинный опрос и откройте новый. После закрытия оперы все дескрипторы файлов закрываются, и все в порядке.

Итак, следует ли добавить некоторые конкретные заголовки для оперы в http-daemon или что-то не так в нашем javascript?

редактировать: Испытано с помощью версии: Opera/9.80 (X11; Linux x86_64; U; еп) Presto/2.6.30 Version/10,63

+0

Вы могли бы разместить где-нибудь фактический фрагмент кода. Трудно анализировать и предлагать вам решение без точного примера. – karlcow

+0

работает в Opera 11? – karlcow

ответ

0

Мы используем базовый длинный метод опроса, который пытается включить JavaScript внутри фрейма ,

Таким образом, соответствующий сокет (ы) снабжает контент iframe?

Кажется, что Opera закрывает эти соединения, если вы нажмете на страницу. Но вы можете попробовать явно разрушив iframes при выходе страницы, что-то вроде:

window.onbeforeunload = function() { 
    theIframe.parentNode.removeChild(theIframe); 
    theIframe = undefined; 
}; 

(я предполагаю, что у вас есть ссылка на IFRAME валяется где-то.)

Редактировать: Или даже навигации по iframe в другом месте:

window.onbeforeunload = function() { 
    theIframe.src = "about:blank";    // <== New bit 
    theIframe.parentNode.removeChild(theIframe); 
    theIframe = undefined; 
}; 
+0

Я смотрю сокеты на стороне сервера;) Соединения не будут закрыты, даже если вы нажмете ссылку, которая идет на другой сайт, или закройте вкладку в вашей опере. Длинные подключения к опросам, похоже, закрываются только при закрытии операционного процесса. –

+0

@ Аннет: Я понимаю. Я говорю, что произойдет, если вы попытаетесь сделать что-то (еще более) явным, чтобы заставить Opera признать, что вы закончили с этим iframe? Это все равно должно быть закрыто, но ... –

+0

Да, должно. Мы попробуем это. Наш javascript парень сказал что-то подобное, когда я рассказал ему об этой проблеме :) –

0

Ну, я думаю, мы получили его «работающим». Без изменения javascript. Я сделал определенное правило для оперы в http-daemon, что он отвечает на старые длинные опросы с «403 Forbidden» (Почему я не попробовал это раньше, это вопрос: P). Простое закрытие() на тех старых сокетах, которые только что сделали опера, снова открывает соединение.

Это смешно, что опера не закрывает эти длинные опросы, даже если я закрываю вкладку в браузере, мне нужно закрыть весь операционный процесс.