Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   AJAX - интернет эксплорер виснет (http://forum.oszone.net/showthread.php?t=69912)

VeshchiyOleg 16-08-2006 10:04 472763

AJAX - интернет эксплорер виснет
 
переделал обычный чат (wwwhl.ru, извините, но если кто надумает посмотреть - надо зарегистрироваться) в чат по технологии AJAX (выложил пока только на тестовый домен test.wwwhl.ru логины и пароли как и на www.wwwhl.ru).
Сначала использовал библиотеки xajax, которые немного переделал под себя (ничего криминального я не менял), но в них в принципе невозможно отправлять два и более параллельных запросов на сервер с одной страницы [а в чем тогда асинхронность??? не пойму... :( ]. Да и эксплорер вис намертво при попытке послать два запроса параллельно (после переделки скриптов). Решил, что что-то тут не так...
Как только убедился в этом окончательно, переписал всё под Subsys_JsHttpRequest_Js. Вышло неплохо, но проблема зависания осталась...
В итоге результат:
Mozilla FireFox 1.5.0.4 - всё работает влёт!!! ни зависаний, ни тормозов!!!
IE 6.0 - сначала вроде всё идет неплохо, но уже через 5-10 минут использования ActiveX браузер начинает тихо умирать... сначала периодически подвисает (и система при этом тормозит не по деццки), а потом вообще - оживет на пару секунд и опять уходит в себя...
Opera 9.0 - на удивление все в порядке вроде... но больше 15 минут не тестировал...

кто знает, из-за чего эксплорер виснет и как с этим бороться???

VeshchiyOleg 16-08-2006 10:29 472782

немного подробностей:
обновление самого чата производится по таймауту через 5 секунд после последнего обновления (не каждые 5 секунд - прошу не путать)
обновление списка присутствующих - через минуту после последнего обновления.

где-то вычитал, будто эксплореру дабы не зависал, надо не асинхронные запросы посылать...

Код:

        req.onreadystatechange = function() {
                if (req.readyState == 4) {
...
                }
        }
        req.caching = false;
        req.open('POST', 'inc/chat.request.php?uid=' + uid, false);
        req.send({ call: 'teamsUpdate', Ordr: Ordr });

в ie работает, в файрфоксе - отказывается...
пришлось переписывать класс Subsys_JsHttpRequest_Js:
Код:

...
                _asyncFlag:                        null,
...
                open: function(method, url, asyncFlag, username, password) {
                        this._openArg = {
                                'method':                method,
                                'url':                        url,
                                'asyncFlag':        asyncFlag != null? asyncFlag : this._asyncFlag,
                                'username':                username != null? username : '',
                                'password':                password != null? password : ''
                        };
                        this._id = null;
                        this._xmlReq = null;
                        this._reqHeaders = [];
                        return true;
                },
...
                // Constructor.
                _construct: function() {
                        if (window.XMLHttpRequest) {
                                this._asyncFlag = true;
                        } else {
                                this._asyncFlag = false;
                        }
                },
...

теперь, когда создается с пустым третьим параметром, всё везде работает:
Код:

        req.open('POST', 'inc/chat.request.php?uid=' + uid);
эксплорер виснет только при медленном коннекте
файрфокс не виснет от этого никогда

помогите определить природу зависаний

Vlad Drakula 16-08-2006 10:33 472787

VeshchiyOleg
1) посылай в асинхронном режиме... в IE он работает нормально...
2) просмотри в сторону библиотеки "прототайп"

VeshchiyOleg 16-08-2006 11:26 472830

1)
Цитата:

в IE он работает нормально...
да я не спорю - первые пять-десять минут - да... но потом.... см.выше
я не первый столкнулся с подобным и не раз читал, что, якобы, эксплорер не освобождает память
динамику использования памяти глянул - вроде ничего сверх обычного...
такая проблема есть только в IE - опера уже три часа без затыков работает...
а в эксплорере - обновляется сначала как положено - через пять секунд, потом через полминуты - минуту, а потом, когда доходит до интервала в 5-10 минут - у меня сдают нервы и я открываю эту же страницу в новом окне - ибо обновить текущую не могу физически - браузер умер.
БЕЗ асинхронности в ie у меня стало работать более-менее сносно, хоть и с FF не сравнить.
с включенной асинхронностью было еще хуже - поверьте - на практике почувствовал.
отрицать очевидного не могу также по причине того, что юзвери, решившиеся на тестирование ругаються почем свет стоит. у них стало быть тоже виснет. у некоторых. а мне надо, чтобы работало у всех!!! ну хотя бы у большинства.

2) можно поподробней???

Vlad Drakula 16-08-2006 11:36 472834

VeshchiyOleg
1) да IE не освобождает память...
http://ajaxian.com/by/topic/utility/page/4/

2) вы используете у себя в часте верстку таблицами?

3)
Цитата:

можно поподробней???
http://forum.oszone.net/thread-46763.html

VeshchiyOleg 16-08-2006 12:40 472855

кстати, я, используя xajax организовывал некое подобие стека.
суть в следующем:
Код:

var FuncToRun = new Array(); //создаем массив для помещения в него функций для запуска

function stekRun(){
    if (FuncToRun.length > 0) { //если есть что выполнять
        eval(FuncToRun[0]);  //выполняем первое, что есть
        for (i = 0; i < FuncToRun.length - 1; i++) {//смещаем всё на один (убираем первый)
            FuncToRun[i] = FuncToRun[i + 1];
        }
        FuncToRun.length--; //уменьшаем длину на единичку
    } else {
        window.setTimeout('stekRun()', 500); // запускаем таймер по-новой
    }
}

function myFuncTimer() {
    FuncToRun[FuncToRun.length] = 'myFunc('+arguments.join(',')+')'; //помещаем функцию в стек
    window.setTimeout('stekRun()', 500); // запускаем таймер по-новой
    window.setTimeout('myFuncTimer('+arguments.join(',')+')', 5000);  // запускаем таймер по-новой
}

function myFunc(){
// здесь что-то делать
}

myFuncTimer(); //запускаем таймер функции
stekRun(); //запускаем выполнятельный таймер



Цитата:

вы используете у себя в часте верстку таблицами?
раньше - да и вообще - мне таблицами удобней... теперь перехожу постеменно на div 'ы
один знакомый дизайнер говорит, буд-то бы так "правильнее"...
пока не всё раскушал, но некоторые вещи действительно удобнее...
тот чат, который на test - уже на div (кроме строки с кнопками и полем сообщения)
а что от этого (способа верстки) зависит???

http://forum.oszone.net/thread-46763.html
я собсна эту тему и нашел, но решил не оффтопить в ней...
причем все-таки "прототайп"???

VeshchiyOleg 16-08-2006 12:54 472865

http://webmascon.com/topics/technologies/13a.asp
красиво, аскетично... но, тем не менее не универсально - и два запроса параллельно не выйдет
и весь этот код надо тащить к каждой аяксинке и доделывать под каждый отдельный случай

создание класса унифицирует обращение к единообразным объектам

к тому же Subsys_JsHttpRequest_Js выдает результаты даже тем, кто без XMLHttpRequest и отключил ActiveX, что немаловажно

VeshchiyOleg 16-08-2006 13:08 472880

http://ajaxian.com/by/topic/utility/page/4/
Drip: IE Leak Detector ???
и что он мне даст???
ну узнаю я, что эксплорер жрет память и не выплевывает... и что мне с того???
как бороться с эксплорером???
не использовать javascript???


кто пользовал Drip: IE Leak Detector ??? - нужная весчь???

Vlad Drakula 16-08-2006 13:36 472899

VeshchiyOleg
Цитата:

раньше - да и вообще - мне таблицами удобней... теперь перехожу постеменно на div 'ы
один знакомый дизайнер говорит, буд-то бы так "правильнее"...
пока не всё раскушал, но некоторые вещи действительно удобнее...
тот чат, который на test - уже на div (кроме строки с кнопками и полем сообщения)
а что от этого (способа верстки) зависит???
дело в том что у IE есть большай проблема с отображением таблиц... он очень долго их парсит... очень долго... и из за этого зачастую и могут случаться минутные подвисания.

Цитата:

window.setTimeout('stekRun()', 500)
это 0,5с а не 5с...

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

VeshchiyOleg 16-08-2006 15:00 472982

Цитата:

Цитата:
Цитата:

window.setTimeout('stekRun()', 500)
это 0,5с а не 5с...
ну да... важно, чтобы проверка стека была чаще его заполнения
каждые полсекунды javascript ничего не делает :)))

Цитата:

в каком случае вы хотите посылать два запроса поралельно?
дело в том, что сам чат и список пользователей обновляются независимо друг от друга, но в одном окне браузера, даже более того - на одной странице... иногда так выходит, что уже во время выполнения запроса на обновление списка пользователей происходит формирование запроса на обновление сообщений чата или наоборот, что непринципиально [о как завернул] важно то, что в этот момент эксплорер виснет

Vlad Drakula 16-08-2006 15:18 472992

VeshchiyOleg
Цитата:

дело в том, что сам чат и список пользователей обновляются независимо друг от друга, но в одном окне браузера, даже более того - на одной странице... иногда так выходит, что уже во время выполнения запроса на обновление списка пользователей происходит формирование запроса на обновление сообщений чата или наоборот, что непринципиально [о как завернул] важно то, что в этот момент эксплорер виснет
1) я бы сказал что это ошибка в проектировании... совершено нету смысла в этом случае делать поралельные асинхронные запросы...
2) надеюсь вы запрашиваете не все сообщения сразу, а только обновившиеся?
3) http://sarissa.sourceforge.net/doc/ - реально помылает запросы в несколько потоков.

VeshchiyOleg 16-08-2006 16:08 473010

1) как я уже говорил выше, процессы друг с другом никак не связанные, так что не вижу смысла связывать их принудительно - а если мне понадобится еще что-нибудь обновить??? а отправка сообщений???
2) да, и дописывается в innerHTML. как только длина innerHTML превышает 32000 - лишнее сверху обрезается. кроме того сообщения приходят в виде хэша - и название написавшего тоже генерится javascript`oм. и еще много чего - целью себе я ставил не столько приобщение к модным направлениям типа AJAX, а снижение трафика. результатом получил тормоза в наиболее часто используем браузере (и не надо меня убеждать в обратном)
3) чем sarissa принципиально отличается от Subsys_JsHttpRequest_Js??? prototype.js - это понятно, но слишком монументально - многое из реализованного не требуется и поэтому "из пушки по воробьям" палить не будем :)

мне кажется, что тут все-таки либо в ActiveX идет затык либо в javascript под ie (вернее тогда уж не javascript, a JScript)
создавать ГЛОБАЛЬНЫЕ объекты-обновлялки (в смысле за пределами функции) мне почему-то не хочется...
почему - пока объяснить не могу
но тогда можно будет сделать им abort() и по новой open() send()

Vlad Drakula 16-08-2006 16:35 473021

VeshchiyOleg
на самом деле идея использования AJAX в данном конкретном случае на факт что вообще оправдана... особых преимуществ это концепция врятли дает...

Цитата:

чем sarissa принципиально отличается от Subsys_JsHttpRequest_Js???
тем что я ее изучал и знаю что она может делать и как она может работать... но это библиотека для крупных приложений... т.к. астоматически увеличивает объем JS кода больше чем на 100кб...

VeshchiyOleg 16-08-2006 16:52 473029

Цитата:

на самом деле идея использования AJAX в данном конкретном случае на факт что вообще оправдана
вот оно как на самом деле оказывается...
на самом деле ныне действующий на основном сайте чат написан, в общем-то, практически по этой же концепции еще три года назад, за исключением той разницы, что используется не объект XMLHttpRequest, а скрытый фрейм

Vlad Drakula 16-08-2006 17:22 473050

VeshchiyOleg
Цитата:

на самом деле ныне действующий на основном сайте чат написан, в общем-то, практически по этой же концепции еще три года назад, за исключением той разницы, что используется не объект XMLHttpRequest, а скрытый фрейм
тогда реально переход на XMLHttpRequest врятли вам принисет много положитеьлных перемен... размер JS кода увеличится скорость работы врятли возрастет...

VeshchiyOleg 16-08-2006 18:52 473110

таким образом, единственным решением проблемы использования AJAX является отказ от AJAX

другие мнения будут???

E-mail 16-08-2006 20:29 473151

VeshchiyOleg заведите нам для тестирования одну на всех учетную запись, совершенно нет желания оставлять свои данные

VeshchiyOleg 17-08-2006 08:36 473285

login: ChatTester
password: 1
вот только если кто под вами зайдет, когда вы в онлайне, то вас... ну не выкинет, но возможность совершать какие-либо действия пропадет...

VeshchiyOleg 17-08-2006 13:24 473460

итак:
1. сделал вместо локальных объектов внутри каждой функции - два глобальных обновителя для каждого div
2. при обращении к этому объекту делаю ему abort или если объекта нет, все же создаю его

результат:
+ тормозов стало заметно меньше
- они не исчезли

VeshchiyOleg 17-08-2006 14:12 473501

разрешил асинхронность для ie
теперь при попытке флуда (когда чаcто отправляешь сообщения) IE даже не виснет - просто вылетает без объяснения причин
вот он (IE) был - я нажимаю в очередной раз Enter и вот его (IE) нет :(

видимо ie не хочет корректно делать abort


Время: 13:32.

Время: 13:32.
© OSzone.net 2001-