PHP и XML

Материал из AOW

Перейти к: навигация, поиск

Настало время использовать XML. Однако, при попытке разобраться и написать несложный скрипт, загружающий XML-файл в массив, я наткнулся на довольно серьёзную проблему – не существует нормальных программных средств и бинарных библиотек PHP для работы с XML.

Далее, в таблице приведены результаты тестирования библиотек, работающих с XML.

File:Sxema15.PNG

Самым совместимым оказался 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 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] "..."

Тесты производительности алгоритмов производились с учетом следующих условий:
Платформа 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.

File:Sxema16.PNG

File:Sxema17.PNG

File:Sxema18.PNG


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 документа. Для нас наиболее важны режимы результаты производительности при режимах нагрузки, такими являются четные тесты:

File:Sxema19.PNG

Тесты 2 и 6, тесты в которых метод 1 идет первым, тесты 4 и 8, тесты в которых метод 2 идет первым.

Из графика следует, что при своем удобстве метод 2 достигает наивысших показателей производительности, только при многочисленном использовании XML в программе.

Метод 1, при меньшей лаконичности и пиковой производительности относительно метода 2, является более стабильным в использовании для разбора в единственном месте работы PHP скрипта.

Таким образом, переход на DOM PHP 5, в независимости от способа разбора XML документа, вполне оправдан, как по удобству кода, так и по производительности, тем более, с учетом того, что в настоящее время PHP 4 практически не используется и несовместим с AOW-SC3 v.1.5 и выше.

Личные инструменты

Разработка веб-сайтов, автоматизация.
По всем вопросам обращайтесь по телефонам:

+7 495 640 29 90
http://artofweb.ru