PHP и XML
Материал из AOW
Настало время использовать XML. Однако, при попытке разобраться и написать несложный скрипт, загружающий XML-файл в массив, я наткнулся на довольно серьёзную проблему – не существует нормальных программных средств и бинарных библиотек PHP для работы с XML.
Далее, в таблице приведены результаты тестирования библиотек, работающих с XML.
Самым совместимым оказался SAX (Simple API for XML), он поддерживается даже в библиотеке EXPAT имеющейся во всех версиях PHP 4 и выше. Однако его возможности и способы применения вызвали резко негативную реакцию – нет возможности модификации XML, крайне громоздкий и сложный код с большим количеством мест для потенциальных ошибок.
DOMXML ужасная вещь, т.к. существовала в виде дополнительных экспериментальных библиотек для PHP 4. В PHP 5 не включена, т.к. PHP 5 по умолчанию обладает более универсальным средством DOM (Стандарт W3C DOM level 3). DOM наиболее документирован (English PHP & W3C) и завершен, однако не включен в PHP 4, т.к. был разработан только к началу 2006. Если выбор станет DOM или PHP4, однозначно следует сказать DOM, т.к. приход PHP 5 дело скорого времени. Тем более у разработчика, есть возможность писать PHP 4 совместимый код, т.к. PHP 4 обладает базовой DOM и она поддерживает некоторые основные функции новой DOM.
Существуют ещё дополнительные библиотеки XML-RPC, но они являются экспериментальными, что говорит само за себя – их тестирование и пробы возможны не ранее чем в 2009 году.
В Рунете нет никакой более-менее полезной литературы на сегодня (лето 2007), все разработчики наповал используют SAX (часто даже свои библиотеки базирующиеся на SAX) либо DOMXML. О DOM ещё мало кто слышал, а те, кто слышал, отказываются от использования в пользу более старого и менее стандартного, но более привычного DOMXML. Таким образом, имеем крайне низкий уровень реализации и переносимость существующих WEB решений использующих XML. Решение использовать новое, удобное, одобренное W3C средство DOM выведет нас далеко вперед по качеству кода, его совместимости и взаимопониманию (DOM в JS идентичен).
Те, кто успешно используют быстрый DOM в PHP 5 – UmiCms. Те, кто используют SAX и собственные DOM – Freelancer’ы Рунета. Те, кто используют DOMXML – В конечном результате пострадают больше всех. Те, кто используют XML-RPC – Тестеры.
С начала 2008 года PHP 5 получил повсеместное распространение, таким образом при дальнейших разработках с использованием технологии XML, имеет смыл использовать исключительно DOM, которым снабжен PHP 5.
Проведем сравнительный анализ производительности SAX PHP 4 и DOM PHP 5. Будет произведен замер времени разбора следующего XML-файла.
- <?xml version="1.0" encoding="windows-1251" ?>
- <links>
- <linksblock>
- <page />
- <page>page=my</page>
- <link><a href="http://artofweb.ru">Создать сайт</a></link>
- <link><a href="http://batarion.ru">Аккумуляторы</a></link>
- </linksblock>
- <linksblock random="3" randomizesequence="1">
- <page>*</page>
- <link><a href="http://artofweb.ru?page=portfolio">портфолио</a></link>
- <link>Тест</link>
- <link>Положите наместо</link>
- <link>Полетели...</link>
- <link>Август?</link>
- <link>...</link>
- </linksblock>
- </links>
SAX алгоритм разбора [1]
Недостатки этого метода разбора XML очевидны: громоздкость, неудобочитаемость программного кода и необходимость использования глобальных переменных.
Приведем 2 метода разбора того же XML файла, базирующиеся на DOM PHP 5.
Метод 1 [2]
Метод использует физическую безадресную навигацию по дереву XML документа.
Метод 2 [3]
Метод использует ассоциативно-адресную навигацию по дереву XML документа.
В заключении замечу, что все три алгоритма в результате получают абсолютно идентичные массивы данных:
- [ integer 0 ] = array
- [ string[10] "attributes" ] = array
- [ string[4] "page" ] = array
- [ integer 0 ] = string[0] ""
- [ integer 1 ] = string[7] "page=my"
- [ string[4] "link" ] = array
- [ integer 0 ] = string[45] "<a href="http://artofweb.ru">Создать сайт</a>"
- [ integer 1 ] = string[45] "<a href="http://batarion.ru">Аккумуляторы</a>"
- [ integer 1 ] = array
- [ string[10] "attributes" ] = array
- [ string[6] "random" ] = string[1] "3"
- [ string[17] "randomizesequence" ] = string[1] "1"
- [ string[4] "page" ] = array
- [ integer 0 ] = string[1] "*"
- [ string[4] "link" ] = array
- [ integer 0 ] = string[64] "<a href="http://artofweb.ru?page=portfolio">портфолио</a>"
- [ integer 1 ] = string[4] "Тест"
- [ integer 2 ] = string[16] "Положите наместо"
- [ integer 3 ] = string[11] "Полетели..."
- [ integer 4 ] = string[7] "Август?"
- [ integer 5 ] = string[3] "..."
- [ string[10] "attributes" ] = array
Тесты производительности алгоритмов производились с учетом следующих условий:
Платформа AMD Athlon(tm) 64 X2 Dual Core Processor 4200+, DDR 2 1024 MB.
Веб-сервер Windows NT 5.1 build 2600, Apache/1.3.33 (Win32) PHP/5.1.6.
1-SAX Произв 1
2-DOM 1 Произв 2
3-DOM 2 Произв 3
Make — режим сборки, Run 10 times — режим нагрузки.
1) Make 2-3-1(порядок следования)
2) Run 10 times 2-3-1(порядок следования)
3) Make 3-2-1(порядок следования)
4) Run 10 times 3-2-1(порядок следования)
5) Make 1-2-3(порядок следования)
6) Run 10 times 1-2-3(порядок следования)
7) Make 1-3-2(порядок следования)
8) Run 10 times 1-3-2(порядок следования)
Очевидно, что наиболее важным на данном этапе анализа является выявление наиболее производительного метода разбора XML основанного на DOM, SAX не рассматриванием, т.к. его отставание и недостатки очевидны.
Напомню, метод 1 использует физическую безадресную навигацию по дереву XML документа, менее удобочитаем, чем метод 2, который использует ассоциативно-адресную навигацию по дереву XML документа.
Для нас наиболее важны режимы результаты производительности при режимах нагрузки, такими являются четные тесты:
Тесты 2 и 6, тесты в которых метод 1 идет первым, тесты 4 и 8, тесты в которых метод 2 идет первым.
Из графика следует, что при своем удобстве метод 2 достигает наивысших показателей производительности, только при многочисленном использовании XML в программе.
Метод 1, при меньшей лаконичности и пиковой производительности относительно метода 2, является более стабильным в использовании для разбора в единственном месте работы PHP скрипта.
Таким образом, переход на DOM PHP 5, в независимости от способа разбора XML документа, вполне оправдан, как по удобству кода, так и по производительности, тем более, с учетом того, что в настоящее время PHP 4 практически не используется и несовместим с AOW-SC3 v.1.5 и выше.

