** Questo è orientato principalmente verso quelli che iniziano con l'analisi XML e non sono sicuro di quale parser usare.
Ci sono due "grandi" modi per fare il parsing - puoi caricare l'XML in memoria e trovare quello che ti serve (DOM, SimpleXML) o puoi eseguire lo streaming - leggerlo ed eseguire il codice in base a ciò che leggi (XMLReader, SAX).
According to Microsoft, SAX è un parser "push", che invia ogni informazione alla tua applicazione e la tua applicazione la elabora. SimpleXML è un parser "pull", che ti permette di saltare pezzi di dati e solo prendere ciò che ti serve. Secondo Microsoft, ciò può semplificare e accelerare la tua applicazione, e suppongo che le implementazioni .NET e PHP siano simili. Suppongo che la tua scelta dipenda dalle tue esigenze: se stai tagliando solo alcuni tag da un blocco più grande e puoi usare lo $xml->next('Element')
per saltare pezzi significativi, potresti scoprire che XMLReader è più veloce di SAX.
Analizzando ripetutamente file "piccoli" (< 30kb, 700 linee) XML, non ci si potrebbe aspettare un'enorme differenza di tempo tra i metodi di analisi. Sono stato sorpreso di scoprire che c'era. Ho eseguito un confronto tra un piccolo feed elaborato in SimpleXML e XMLReader. Speriamo che questo possa aiutare qualcun altro a visualizzare quanto sia importante questa differenza. Per un confronto reale, questo sta analizzando la risposta a due feed di richieste di informazioni sul prodotto Amazon MWS.
Ogni Parse Time è il tempo richiesto per prendere 2 stringhe XML e restituire circa 120 variabili contenenti valori di ogni stringa. Ogni ciclo prende dati diversi, ma ognuno dei test era sugli stessi dati nello stesso ordine.
SimpleXML carica il documento in memoria.Ho usato il microtime per controllare sia il tempo per completare l'analisi (estrai i valori rilevanti), sia il tempo impiegato per creare l'elemento (quando è stato chiamato new SimpleXMLElement($xml)
). Ho arrotondato questi a 4 cifre decimali.
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.
Mentre il XMLReader, che si basa flusso, sono stato in grado di saltare un pezzo significativo di uno dei feed XML in quanto i dati che volevo era vicino alla parte superiore di ogni elemento. "Il tuo chilometraggio può variare".
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
Ciò che colpisce è che anche posizionare elementi è lievemente superiore nella SimpleXML una volta che è tutto caricato, è in realtà oltre 6 volte più veloce usare XMLReader complessiva.
Potete trovare alcune informazioni su come usare XMLReader a How to use XMLReader in PHP?
è thread-sicurezza davvero un problema? Il 99% delle applicazioni PHP sono a thread singolo. –
Sono abbastanza sicuro che stia parlando delle condizioni di gara [basate su un'altra sua domanda] (http://stackoverflow.com/questions/3030122/is-splfileobject-atomic/3048658#3048658). – Charles
Ho paura che lo sia. Suppongo che userò SimpleXML. Non ho idea delle sue prestazioni, comunque. –