Каков самый быстрый XML-парсер в PHP?
для определенного проекта, мне нужно каким-то образом разобрать XML и получить данные от него. Так что, интересно, какой из встроенных парсеров является самым быстрым?
Кроме того, было бы неплохо, чтобы анализатор мог принимать XML-строку в качестве входных данных - у меня есть своя реализация потокобезопасной работы с файлами, и я не хочу, чтобы некоторые неприятные библиотеки, не связанные с потоками, делали мои усилия бесполезно.
Ответы
Ответ 1
Самый быстрый парсер будет SAX - ему не нужно создавать dom, и это можно сделать с помощью частичного xml или постепенно. Информацию о PHP SAX parser (Expat) можно найти здесь. Кроме того, существует основанный на libxml парсер DOM с именем SimpleXML. Парсер, основанный на DOM, будет легче работать, но он, как правило, на несколько порядков медленнее.
Ответ 2
** Это ориентировано прежде всего на те, которые начинаются с анализа XML, и не уверены, какой парсер использовать.
Существует два "больших" способа анализа: вы можете загружать XML в память и находить то, что вам нужно (DOM, SimpleXML), или вы можете передавать его - читать и выполнять код на основе того, что вы читаете ( XMLReader, SAX).
В соответствии с Microsoft SAX - это синтаксический анализатор, который отправляет каждую информацию в ваше приложение, и ваше приложение обрабатывает его. SimpleXML - это синтаксический анализатор, который позволяет вам пропускать фрагменты данных и получать только то, что вам нужно. По мнению Microsoft, это может упростить и ускорить ваше приложение, и я бы предположил, что реализация .NET и PHP аналогична. Я предполагаю, что ваш выбор будет зависеть от ваших потребностей - если вы вытаскиваете только несколько тегов из большего фрагмента и можете использовать $xml->next('Element')
для пропуска значительных фрагментов, вы можете обнаружить, что XMLReader быстрее SAX.
Повторяя синтаксический анализ "малых" (< 30kb, 700 строк) файлов XML, вы не можете ожидать, что между методами анализа будет огромная разница во времени. Я был удивлен, обнаружив, что это было. Я провел сравнение небольшого фида, обработанного в SimpleXML и XMLReader. Надеюсь, это поможет кому-то еще понять, насколько важны эти данные. Для сравнения реальной жизни, это синтаксический анализ ответа на два канала запроса информации о продукции Amazon MWS.
Каждое время анализа времени - это время, необходимое для принятия 2 строк XML и возврата около 120 переменных, содержащих значения из каждой строки. Каждый цикл принимает разные данные, но каждый из тестов находился на одних и тех же данных в том же порядке.
SimpleXML загружает документ в память. Я использовал microtime, чтобы проверить время, необходимое для завершения анализа (извлечь соответствующие значения), а также время, затрачиваемое на создание элемента (когда был вызван new SimpleXMLElement($xml)
). Я округл их до 4 знаков после запятой.
Parse Time: 0.5866 seconds
Parse Time: 0.3045 seconds
Parse Time: 0.1037 seconds
Parse Time: 0.0151 seconds
Parse Time: 0.0282 seconds
Parse Time: 0.0622 seconds
Parse Time: 0.7756 seconds
Parse Time: 0.2439 seconds
Parse Time: 0.0806 seconds
Parse Time: 0.0696 seconds
Parse Time: 0.0218 seconds
Parse Time: 0.0542 seconds
__________________________
2.3500 seconds
0.1958 seconds average
Time Spent Making the Elements: 0.5232 seconds
Time Spent Making the Elements: 0.2974 seconds
Time Spent Making the Elements: 0.0980 seconds
Time Spent Making the Elements: 0.0097 seconds
Time Spent Making the Elements: 0.0231 seconds
Time Spent Making the Elements: 0.0091 seconds
Time Spent Making the Elements: 0.7190 seconds
Time Spent Making the Elements: 0.2410 seconds
Time Spent Making the Elements: 0.0765 seconds
Time Spent Making the Elements: 0.0637 seconds
Time Spent Making the Elements: 0.0081 seconds
Time Spent Making the Elements: 0.0507 seconds
______________________________________________
2.1195 seconds
0.1766 seconds average
over 90% of the total time is spent loading elements into the DOM.
Only 0.2305 seconds is spent locating the elements and returning them.
В то время как XMLReader, основанный на потоке, я смог пропустить значительную часть одного из XML-каналов, поскольку нужные мне данные были близкими к вершине каждого элемента. "Ваш пробег может варьироваться".
Parse Time: 0.1059 seconds
Parse Time: 0.0169 seconds
Parse Time: 0.0214 seconds
Parse Time: 0.0665 seconds
Parse Time: 0.0255 seconds
Parse Time: 0.0241 seconds
Parse Time: 0.0234 seconds
Parse Time: 0.0225 seconds
Parse Time: 0.0183 seconds
Parse Time: 0.0202 seconds
Parse Time: 0.0245 seconds
Parse Time: 0.0205 seconds
__________________________
0.3897 seconds
0.0325 seconds average
Что поразительно, так это то, что, хотя расположение элементов в SimpleXML немного быстрее, как только оно загружено, на самом деле более в 6 раз быстрее использовать XMLReader.
Вы можете найти некоторую информацию об использовании XMLReader в Как использовать XMLReader в PHP?
Ответ 3
Каждое расширение XML имеет свои сильные и слабые стороны. Например, у меня есть script, который анализирует дамп данных XML из Stack Overflow. Файл posts.xml составляет 2,8 ГБ! Для этого большого XML файла мне пришлось использовать XMLReader
, потому что он читает XML в потоковом режиме, вместо того, чтобы пытаться загружать и представлять весь XML-документ в памяти сразу, как это делает расширение DOM.
Итак, вам нужно более подробно описать, как вы собираетесь использовать XML, чтобы решить, какое расширение PHP использовать.
Все PHP-расширения XML предоставляют некоторый способ чтения XML-данных в виде строки.
Ответ 4
В PHP не так много парсеров.
Наиболее эффективными будут те, которые предоставляются PHP, пишут тесты с DOM и SimpleXML и проверяют, какая из них работает лучше.