Показать полную графическую версию : 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
другие мнения будут???
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC