С появлением все более и более сложных Флэш-проектов возрастает и количество подгружаемых в них XML-данных, что влечет за собой целесообразность оптимизации процесса загрузки XML.
Mattias Strindsman (более известный как Strille) изобрел, как ускорить загрузку XML за счет сокращения его размера (сжатия) в несколько раз. Очевидцы первых сжатий утверждают, что XML-файл размером в 225Кб был сжат до 16Кб, а затем успешно загружен и правильно обработан во Flash-приложении.
По порядку:
AS1-Код парсера:
XML.prototype.parseXMLStandard = XML.prototype.parseXML; XML.prototype.parseXML = function(i) { if (i.charAt(0) != '<') { var ecPos = i.indexOf(" ")+1; var eC = i.charAt(ecPos); i = i.substr(ecPos+1); var o = ""; var iL = i.length; for (var n=0;n<iL;n++) { if (i.charAt(n) == eC) { var p = i.charCodeAt(n+1)*114 + i.charCodeAt(n+2) - 1610; var l = i.charCodeAt(n+3)-14; o += o.substr(-p, l); n += 3; } else { o += i.charAt(n); } } this.parseXMLStandard(o); } else { this.parseXMLStandard(i); } }
На сайте автора выложена программа для сжатия XML -- Flash XML Compressor (Zip, 14 Кб). Для ее работы нужна установленная Microsoft .Net Framework.
Чтобы сжать XML-файл, просто перетащите его на иконку или окно приложения Flash XML Compressor. Не забудьте заглянуть в опции программы и на домашнюю страницу Flash XML Compressor
// via Strille Tutorials
Вот это интересно! И ведь, на поверхности лежало!
ИМХО, эта вестчь станет полезнее процентов на 1000 если сделать сжималку в виде php-шной библиотеки и продумать сжатие потока. Статических, редкоизменяемый xml - слишком частная задача, сжимать ручками запаришься. Самые сложные и большие XML строятся по данным из БД. В конце концов, если речь идет о библиотеке разжатия и формате компактного хранения структурированных данных, то таких форматов существует масса, и они не частные, а стандартные для индустрии...
Смольный, это прекрасная идея. Думаю, PHP-программисты могли бы взять ее на вооружение!
ай... а кто php класс или функцию напишет?
чё за Microsoft .Net Framework.
помнитсая в марте нарисовался вот такой солюшн подобной проблемы: поскольку большинство броузеров нормально понимает GZIP'ованый контент то не париться и гзиповать... а флеш все равно сам не качает, т.ч. броузер ему все сольет, распакует и скормит нормальный ХМЛ. тестилось только под окнами, но мне больше и не надо было.
# # можно пользовать стандартный: ob_start("gz_handler"); # но поскольку это слишком высокоинтелектуальная штука, для тестов она не подходит. # //gz_handler сам решает можно ли паковать контент в зависимости от версии броузера # // и HTTP ... или от Accept-Encoding, это ему как бог на душу положит # # потестить можно зафорсив упаковку таким макаром (писано под php 4.3.x): # размеры жатого и нежатого файлов можно посмотреть в хедерах. # # проблема будет под ИЕ, ежели юзать HTTP/1.0 через прокси. # для нормальной работы ИЕ нужно переключить в HTTP/1.1 # # если что - спрашивайте меня в ruFlash'е :) #
[php] if (!isSet($mode)) $mode = 0;
$XML = file_get_contents("./test.xml"); header("X-size-real: ".strlen($XML));
if ($mode==1) { $XML = gzencode($XML); header("X-size-gzipped: ".strlen($XML)); header("Content-Encoding: gzip"); } Header("Content-type: text/xml"); echo "$XML"; [/PHP]
З.Ы.: идея успешно юзается для внутренних нужд. насколько она жизнеспособна под nix'ами и на mac'е не знаю. можно конечно написать на ПХП упаковщик под этот прототип, но распаковываться жатый контент средствами флеша будет ГОРАЗДО медленне чем средствами ОСи/Броузера
Во! Очень разумная мысль - gzip... Браузеров таких что не понимают - мало. А для них можно оставить и версию файла (вариант-скрипта) который жаться не будет...
Петрович, ты хорошо соображаешь!
>А для них можно оставить и версию файла (вариант-скрипта)
я для себя планировал поступать так: перед первой загрузкой нужных данных проверяем соединение. тупо скачиваем короткий test.xml принудительно погзипаный. затем если он пришел покореженый или оборвался по таймауту, значит броузер тупой и ГЗИП не понимает. соответственно все дальнейшие загрузки нужно производить без сжатия. например добавля в GET usegzip=0 или поросив сервер навесить юзеру печеньку с usegzip=0... ну а после проверки гзипать все если директивы этого не делать НЕТ.
только вот за отсутствием надобностив такой проверке я ее не делал. просто в моей ситуации гзипаный ХМЛ будет отдаваться в проверенные руки с которыми проблем с "я ГЗИПа не понимаю" просто не будет...
Блин! чуть не забыл :))) кроме РАЗМЕРА файла, немаловажную роль играет кеширование :)
можно решать через ETag и затем проверку If-None-Match. в etag пишем md5-хеш...
все. теперь не нужно добавлять всякие ?rnd=239848347, если файло не изменилось на сервере будет браться из кеша. причем каждый раз перед тем как взять броузер ОБЯЗАТЕЛЬНО поинтересуется можно ли ;)
выглядит примерно так (встявляем сразу после загрузки XML'я в пхп): [php] $eTag = md5($XML); $useCached = isset($HTTP_SERVER_VARS['HTTP_IF_NONE_MATCH']) ? stripslashes($HTTP_SERVER_VARS['HTTP_IF_NONE_MATCH']) : false; $useCached = $useCached ? ($useCached === $eTag) : false; header ("Expires: 11 Jun 1970 19:00:00 GMT"); header ("Pragma: no-cache"); if ($useCached) { header("HTTP/1.0 304 Use Cached Copy"); Header("ETag: ".$eTag); exit; } else { Header("HTTP/1.0 200 Ok"); Header("ETag: ".$eTag); header ("Cache-Control: private, must-revalidate"); } [/php]
Очень интересно. Надо будет попробовать.
Спасибо Петровичу за наше счастливое детство!