PDA

Показать полную графическую версию : AJAX - интернет эксплорер виснет


VeshchiyOleg
16-08-2006, 10:04
переделал обычный чат (wwwhl.ru (http://www.wwwhl.ru), извините, но если кто надумает посмотреть - надо зарегистрироваться) в чат по технологии AJAX (выложил пока только на тестовый домен test.wwwhl.ru (http://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
немного подробностей:
обновление самого чата производится по таймауту через 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
VeshchiyOleg
1) посылай в асинхронном режиме... в IE он работает нормально...
2) просмотри в сторону библиотеки "прототайп"

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

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

Vlad Drakula
16-08-2006, 11:36
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
кстати, я, используя 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
http://webmascon.com/topics/technologies/13a.asp
красиво, аскетично... но, тем не менее не универсально - и два запроса параллельно не выйдет
и весь этот код надо тащить к каждой аяксинке и доделывать под каждый отдельный случай

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

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

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


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

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

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

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

VeshchiyOleg
16-08-2006, 15:00
Цитата:
window.setTimeout('stekRun()', 500)
это 0,5с а не 5с...

ну да... важно, чтобы проверка стека была чаще его заполнения
каждые полсекунды javascript ничего не делает :)))

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

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

VeshchiyOleg
16-08-2006, 16:08
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
VeshchiyOleg
на самом деле идея использования AJAX в данном конкретном случае на факт что вообще оправдана... особых преимуществ это концепция врятли дает...

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

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

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

VeshchiyOleg
16-08-2006, 18:52
таким образом, единственным решением проблемы использования AJAX является отказ от AJAX

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

E-mail
16-08-2006, 20:29
VeshchiyOleg заведите нам для тестирования одну на всех учетную запись, совершенно нет желания оставлять свои данные

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

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

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

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

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




© OSzone.net 2001-2012