2010-06-15 22 views
18

para un cierto proyecto, necesito alguna forma de analizar XML y obtener datos de él. Entonces me pregunto, ¿cuál de los analizadores integrados es el más rápido?¿Cuál es el analizador XML más rápido en PHP?

Además, sería bueno que el analizador pudiera aceptar una cadena XML como entrada - Tengo mi propia implementación de trabajo seguro de subprocesos con archivos y no quiero algunas desagradables bibliotecas no seguras para subprocesos para hacer que mi esfuerzos inútiles.

+1

Es hilos de seguridad realmente una preocupación? El 99% de las aplicaciones de PHP tienen un solo subproceso. –

+0

Estoy bastante seguro de que está hablando de condiciones de carrera [en función de otra cuestión suya] (http://stackoverflow.com/questions/3030122/is-splfileobject-atomic/3048658#3048658). – Charles

+0

Me temo que es. Supongo que usaré SimpleXML. Sin embargo, no tengo idea de su rendimiento. –

Respuesta

8

El analizador más rápido será SAX - no tiene que crear un dom, y se puede hacer con xml parcial o progresivamente. Información sobre el PHP SAX parser (Expat) can be found here. Alternativamente hay un libxml based DOM parser named SimpleXML. Será más fácil trabajar con un analizador basado en DOM, pero generalmente es un poco más lento.

+0

De acuerdo. Rendimiento inmejorable en modo de transmisión, consumo de memoria muy bajo. Para XML feed-like o repetitivos la mejor opción. Mire el ejemplo en http://www.php.net/manual/en/function.xml-parse.php. Probado en 10MB XML, analizar el tiempo alrededor de 3 segundos en el portátil I7 incluyendo la tienda en la tabla plana de MySQL con índice de texto completo, el montón de pico utilizado alrededor de 600kB (!) – OSP

+6

Si solo ... Muchos de nuestros clientes corporativos están cambiando de CSV a XML y piensa que JSON es un tipo de cuentas. – Tamlyn

0

No hay realmente muchos analizadores sintácticos en PHP.

Los más efectivos serán aquellos provistos con PHP, escribir un punto de referencia con DOM y SimpleXML y comprobar cuál funciona mejor.

+7

¡No solo comparta, compare y publique sus datos de prueba, métodos de prueba y resultados! – Charles

2

Cada extensión XML tiene sus propias fortalezas y debilidades. Por ejemplo, tengo un script que analiza el volcado de datos XML desde Stack Overflow. El archivo posts.xml es de 2,8 GB. Para este gran archivo XML, tuve que usar XMLReader porque lee XML en modo de transmisión, en lugar de intentar cargar y representar todo el documento XML en la memoria a la vez, como lo hace la extensión DOM.

Por lo tanto, debe ser más específico al describir cómo va a usar el XML, para decidir qué extensión de PHP usar.

Todas las extensiones XML de PHP proporcionan algún método para leer datos XML como una cadena.

+0

¿Cuál recomendaría usted como el más rápido para cargar muchos pequeños archivos xml? –

+0

@JohnMagnolia, probaría tanto SimpleXML como el analizador SAX mencionado en la respuesta de Evan Carroll. La velocidad es una consideración, así como la facilidad de la interfaz de programación. El último es una cuestión de gusto personal, por lo que debes probar ambos y ver lo que te gusta. –

+0

En respuesta a la pregunta de John Magnolia, XMLReader que SimpleXML es más rápido para muchos archivos pequeños (vea mi respuesta a continuación); presumiblemente SAX también lo sería. – Josiah

8

** Esto está dirigido principalmente a aquellos que comienzan con XML Parsing y no están seguros de qué analizador usar.

Existen dos "grandes" formas de realizar el análisis: puede cargar el XML en la memoria y encontrar lo que necesita (DOM, SimpleXML) o puede transmitirlo, leerlo y ejecutar el código según lo que lea (XMLReader, SAX).

According to Microsoft, SAX es un analizador "push", que envía cada información a su aplicación y la procesa. SimpleXML es un analizador "pull", que le permite omitir fragmentos de datos y solo obtener lo que necesita. Según Microsoft, esto puede simplificar y acelerar su aplicación, y supongo que las implementaciones de .NET y PHP son similares. Supongo que su elección dependería de sus necesidades: si está sacando solo algunas etiquetas de un trozo más grande y puede usar el $xml->next('Element') para omitir fragmentos significativos, es posible que XMLReader sea más rápido que SAX.

Analizando "pequeño" (< 30kb, 700 líneas) archivos XML repetitivamente, es posible que no espere que haya una gran diferencia de tiempo entre los métodos de análisis. Me sorprendió descubrir que había. Ejecuté una comparación de un feed pequeño procesado en SimpleXML y XMLReader. Es de esperar que esto ayude a otra persona a visualizar cuán importante es esta diferencia. Para una comparación de la vida real, se trata de analizar la respuesta a dos feeds de solicitud de Amazon MWS Product Information.

Cada Parse Time es el tiempo requerido para tomar 2 cadenas XML y devolver aproximadamente 120 variables que contienen valores de cada cadena. Cada ciclo toma datos diferentes, pero cada una de las pruebas estaba en los mismos datos en el mismo orden.

SimpleXML carga el documento en la memoria.Usé microtime para verificar tanto el tiempo para completar el análisis (extraer los valores relevantes), como el tiempo dedicado a crear el elemento (cuando se llamó al new SimpleXMLElement($xml)). Los redondeé a 4 decimales.

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. 

Mientras que el XMLReader, que se basa corriente, yo era capaz de saltar una parte significativa de una de las fuentes XML ya que los datos que quería era cerca de la parte superior de cada elemento. "Su experiencia puede ser diferente."

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 

Lo que es sorprendente es que a pesar de la localización de los elementos es ligeramente más rápido en SimpleXML una vez que se ha cargado todo, en realidad es más de 6 veces más rápido usar XMLReader general.

Puede encontrar información sobre el uso de XMLReader en How to use XMLReader in PHP?

Cuestiones relacionadas