Просмотр полной версии : Вопрос к профи: как лучше организовать многократный опрос сервера?
Друзья, прошу помощи по следующей проблеме - нужно организовать взаимодействие с сервером (отправку/прием данных в xml). По запросу юзера(нажатию кнопочки) Flash-клиент вызывает сценарий PHP, который в ответ отдает ему XML. Запросы пользователи могут делать довольно часто (нажимать кнопочку раз в 0,5-1 сек.), а сервер возвращает довольно большой пакет данных.
Вопрос, собственно, в том, каким образом сбрасывать соединение, если пользователь вызывает новый запрос из флэшки. Т.е. предположим юзер нажал кнопку обновления -> пошел запрос к скрипту script.php -> скрипт отдает данные XML, пакет по медленному (скажем модемному) соединению идет к флэшке... и вдруг пользователь не дождавшись поступления старых данных требует обновления и вновь посылает запрос. Что произойдет с этим недокачанным пакетом? Нужно как-то его сбросить...
На флэше сделано так: создается LoadVars, определяется обработчик onLoad к нему, вызывается load(script.php). Если пользователь делает новый вызов скрипта LoadVars, то убивается (delete LoadVars_obj) и тут же снова создается, опять определяется обработчик onLoad к нему и вызывается load(script.php).
Вопрос в том что при многократном быстром нажатии кнопки "обновить" возникают какие-то задержки (тест на модеме) в получении данных. Сдается мне, что как-то оно глючит... Не может ли быть случайно так, что объект принимает сразу несколько переданных сервером пакетов (т.е. часть старых, вызов которых был инициирован уже удаленной копией объекта)?
Бармалей
17.05.2006, 16:49
Если ты думаешь обмениваться XML-данными, то LoadVars тут явно не подходит. Для этих целей нужно использовать классы XML или XMLSocket. Второй класс более предпочтителен, так как умеет "держать" соединение, а не инициировать его каждый раз, когда возникает необходимость обмена данными с сервером.
Ой, ой ой... XML конечно, а не LoadVars :) Опечатка! Туплю... Сокет не подходит, к сожалению.
Бармалей
17.05.2006, 16:53
Для отбрасывания "устаревших" данных можно попробовать отсылать серверу какой-либо идентификатор (например, номер) соединения, чтобы сервер, увидев что запрашиваются новые данные, когда старые еще не отправлены, заканчивал передачу "старых" данных и начинал передавать новые.
А не проще ли заблокировать кнопку обновления до тех пор, пока не получим результат :)
А вообще неплохо использовать Flash Remoting + php, это продуктивнее, потому из флэша напрямую будешь вызывать php функции и получать результирующий объект, который не надо парсить, как XML. Соответственно будет работать быстрее чем связка Flash<->XML<->php, где мы используем XML как промежуточное звено.
Бармалей
17.05.2006, 17:07
Madasan, а где можно про Flash Remoting информацию достать?
Данные для всех этих запросов получаются одинаковыми, никаких обновления на сервере за короткий промежуток не происходит. Вопрос в том что
delete XMLObj;
XMLObj = new XML();
XMLObj.load("script.php");
однозначно убивает старый объект XML? невостребованная партия данных не может попасть во вновь созданный XML? (который уже успел отправить новый запрос load)
кнопка сейчас и блокируется на несколько секунд, но хочется теорию этого вопросы понять... вдруг данные от предыдущего вызова "задержаться" и придут уже во вновь созданный объект? или такого быть не может?
>'Madasan, а где можно про Flash Remoting информацию достать?'
Да вот на русском не густо http://novemberain.com/tools/index.php/Flash_Remoting
А на английском найти не сложно. http://www.adobe.com/devnet/flash/articles/amfphp.html
Бармалей
17.05.2006, 17:19
Спасибо
vecalion
17.05.2006, 17:33
А вообще неплохо использовать Flash Remoting + php, это продуктивнее, потому из флэша напрямую будешь вызывать php функции и получать результирующий объект, который не надо парсить, как XML. Соответственно будет работать быстрее чем связка Flash<->XML<->php, где мы используем XML как промежуточное звено.
Flash Remoting тоже использует промежуточное звено, однако оно скрыто от нас. Поэтому теоретически скорости сопоставимы. На практике же, всё зависит от Flash<-этого звена->XML<-и этого->php. Хотя обогнать, вылизанные библиотеки вряд ли удасться :)
Flash Remoting тоже использует промежуточное звено, однако оно скрыто от нас. Поэтому теоретически скорости сопоставимы. На практике же, всё зависит от Flash<-этого звена->XML<-и этого->php. Хотя обогнать, вылизанные библиотеки вряд ли удасться :)Не похоже на то что сопоставимы, парсинг XML это не серилизация amfphp, вещи разные, если еще учесть, что последнее, то что скрыто от нас проделывается на сервере, и не напрягает флэш. А промежуточные звенья всегда можно найти, флэш плеер например использует возможности браузера для формирования запросов, и это тоже скрыто от нас... Сколько же всего скрыто от наших глаз? Да собственно от любопытного глаза ничего не скроешь...
по теме больше мыслей нет? :)
вдруг данные от предыдущего вызова "задержаться" и придут уже во вновь созданный объект? или такого быть не может?Так проверить можно, я такими безобразиями не занимался, честно не знаю куда придут данные, если принимающий объект удалить.:eek:
Бармалей
17.05.2006, 19:11
Сделай метод-оболочку для метода send или sendAndLoad, в котором проверяй переменную, показывающую статус объекта XML (загружаю или свободен) и если экземпляр XML в настоящее время загружает, прерывай работу метода:
myLoader:XML = new XML();
myLoader.onLoad = function(){
usage = false;
// здесь действия по обработке
}
myLoader.mySend = function(){
if(usage == true){
return;
}
usage = true
send();
}
Бармалей
17.05.2006, 19:16
Блин, вопрос-то изменился. Если убивается объект XML, то соединение закрывается. По крайней мене здравый смысл подсказывает, что должно работать именно так. По идее, оператор delete, примененный к объекту XML должен вызывать что-то типа внутреннего метода die(), который обязан закрыть коннект и прервать получение данных.
myLoader:XML = new XML();
myLoader.onLoad = function(){
usage = false;
// здесь действия по обработке
}
myLoader.mySend = function(){
if(usage == true){
return;
}
usage = true
send();
}Это и есть блокировка обновления, у тебя есть флаг usage. Когда загрузка началась он true, когда закончилась false, и пока оно true новый запрос не посылается. Только я бы задавал false после обработки полученного результата. ТАк, на всякий случай. :)
это-то все понятно... а если в процессе передачи произошла ошибка и onLoad не выполнилось? нет, мне так просто не покатит :) щас буду пробовать...
хм, а проблема похоже в том, что обработчик onLoad delete'ом не убивается!!! После завершения загрузки одной из порций данных он вызывается несмотря ни на что! Что-то не понятное....
http://www.flasher.ru/forum/showthread.php?t=79881
Блин, вопрос-то изменился. Если убивается объект XML, то соединение закрывается. По крайней мене здравый смысл подсказывает, что должно работать именно так. По идее, оператор delete, примененный к объекту XML должен вызывать что-то типа внутреннего метода die(), который обязан закрыть коннект и прервать получение данных.
До следующей серии очистки памяти gc не тронет его в любом случае.
Загружаем несуществующий документ в данный -- и все. Со звуком такая штука отрабатывает. MovieClipLoader останавливается удалением контейнера...
Загружаем несуществующий документ в данный -- и все. Со звуком такая штука отрабатывает.
Не срабатывает! Загрузка несуществующего документа ничего не дает. Обработчик onLoad убить можно только напрямую:
testXML.onLoad = null;
Но если попытаться теперь удалить объект XML и загрузить в него тот же документ заново, то загрузка начнется только после окончательной прогрузки первоговызова load. Бред!
testXML = new XML();
testXML.onLoad = function() {
trace('Загружено по первому обращению');
}
testXML.load("data.xml");
bt.onRelease = function() {
testXML.onLoad = null;
delete testXML;
testXML = new XML();
testXML.onLoad = function() {
trace('Загружено по второму обращению');
}
testXML.load("data.xml");
}
- результатом будет trace('Загружено по второму обращению');, но только после прорузки обоих файлов!!!
Как остановить загрузку первого файла?
Офигенная эта штука flash remoting!
только яндекс выдет почему то предложения на неё от 65 до 5000 баксов. В чем разница? кто нить работал?
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.