2009-07-08 13 views
4

Lassen Sie meinen Lurker-Status fallen, um endlich eine Frage zu stellen ...Wie verbessert man die XML-Ladezeit von PHP?

Ich muss wissen, wie ich die Leistung eines PHP-Skripts verbessern kann, das seine Daten aus XML-Dateien bezieht.

Einige Hintergrundinformationen:

  • Ich habe kartiert bereits den Engpass zu CPU - aber wollen die Leistung des Skript zu optimieren, bevor ein Hit auf dem Prozessor Kosten nehmen. Der CPU-aufwendigste Teil des Skripts ist das Laden von XML.

  • Der Grund, warum ich XML zum Speichern von Objektdaten verwende, da die Daten über eine Flash-Oberfläche des Browsers zugänglich sein müssen und wir einen schnellen Benutzerzugriff in diesem Bereich bereitstellen möchten. Das Projekt befindet sich jedoch noch in einem frühen Stadium, und wenn Best Practice wäre, XML ganz aufzugeben, wäre das auch eine gute Antwort.

  • Viele Daten: Derzeit für ungefähr 100k Objekte, wenn auch in der Regel kleine, plotten - und sie müssen ALLE mit vielleicht ein paar seltenen Ausnahmen in das Skript aufgenommen werden. Der Datensatz wird nur mit der Zeit wachsen.

  • Häufige Läufe: Im Idealfall würden wir das Skript ~ 50k Mal pro Stunde ausführen; realistisch würden wir uns mit ~ 1k/h Läufen zufrieden geben. Dies, gekoppelt mit der Datengröße, macht eine Leistungsoptimierung absolut notwendig.

  • Es wurde bereits ein Optimierungsschritt durchgeführt, bei dem mehrere Läufe mit denselben Daten durchgeführt werden, anstatt sie für jeden Lauf zu laden, aber es dauert immer noch zu lange. Die Läufe sollten im Allgemeinen "frische" Daten mit den von den Benutzern vorgenommenen Änderungen verwenden.

Antwort

3

Nur um zu verdeutlichen: Sind die Daten, die Sie laden, aus XML-Dateien zur Verarbeitung in ihrem aktuellen Zustand und werden sie vor dem Senden an die Flash-Anwendung modifiziert?

Es sieht so aus, als wäre es besser, wenn Sie eine Datenbank verwenden, um Ihre Daten zu speichern und XML nach Bedarf auszugeben, anstatt es zuerst in XML zu lesen. Wenn das Erstellen der XML-Dateien langsam wird, können Sie die Dateien im Cache speichern, während sie generiert werden, um eine redundante Generierung derselben Datei zu vermeiden.

+0

Das würde ich vorschlagen. +1 – ceejayoz

+0

Ja, 100k-Objekte werden besser in einer eingebetteten Datenbank gespeichert, oder eine dedizierte, wenn Sie darauf zugreifen können. Dann können Sie nur die Bits des XML generieren, die der Client benötigt. –

+0

Zur Verdeutlichung: Die Flash-Schnittstelle und die Läufe sind vollständig getrennt, mit der Ausnahme, dass die Läufe einige Daten modifizieren, die eventuell angezeigt werden können. Die Läufe sind jedoch unabhängig davon, ob die Objekte von Benutzern abgefragt werden oder nicht. Die aus XML stammenden Daten sind in ihrem aktuellen Zustand; Wenn es an Flash gesendet wird, wird es nicht geändert. Die Benutzer haben jedoch die Möglichkeit, über die Schnittstelle Änderungen an geladenen Dateien vorzunehmen. Die Frage ist, schnellerer Benutzerzugriff nicht, aber funktioniert die Arbeit mit einer DB * beschleunigt *? Wir sind derzeit mehr besorgt darüber. – Polymeron

1

Wenn die XML relativ statisch bleibt, können Sie es als PHP-Array-Cache könnte, so etwas wie dieses:

<xml><foo>bar</foo></xml> 

in einer Datei als

<?php return array('foo' => 'bar'); 

zwischengespeichert wird, sollte es sein schneller für PHP, um einfach die Arrayed-Version des XML zu integrieren.

+0

Dies ist eine gute Antwort, aber wir machen das schon für mehrere Läufe gleichzeitig; Es wird erwartet, dass der XML-Code nicht länger als ein paar Sekunden statisch bleibt, aber wir lassen einige wenige Änderungen zu, die für ein paar Läufe verstrichen sind. Danach müssen wir alle Änderungen übernehmen, was bedeutet, das Array neu zu erstellen. Immer noch sehr CPU-intensiv. – Polymeron

0

~ 1k/Stunde, 3600 Sekunden pro Stunde, mehr als 3 läuft eine zweite (geschweige denn die 50k/Stunde) ...

Es gibt viele Fragen. Einige davon sind:

  • Muss Ihr PHP-Skript alle Datensätze der Datenquelle für jeden einzelnen Lauf lesen/verarbeiten? Wenn nicht, welche Art von Teilmenge benötigt es (~ Größe, Kriterien, ...)
  • Gleiche Frage für die Flash-Anwendung + Wer sendet die Daten? Das PHP-Skript? "Direct" Anfrage für die vollständige, statische XML-Datei?
  • Welche Operationen werden an der Datenquelle ausgeführt?
  • Benötigen Sie eine Art Nebenläufigkeitsmechanismus?
  • ...

Und nur weil Sie XML-Daten in den Flash-Kunden liefern wollen, dass es nicht unbedingt bedeuten, dass Sie XML-Daten auf dem Server gespeichert werden müssen. Wenn z.B. Die Clients brauchen nur eine winzige kleine Teilmenge der verfügbaren Datensätze, es ist wahrscheinlich viel schneller, die Daten nicht als XML zu speichern, sondern etwas, das eher für Geschwindigkeit und "Durchsuchbarkeit" geeignet ist und dann vielleicht die XML-Ausgabe der Untermenge on-the-fly erzeugt unterstützt durch Caching, abhängig davon, welche Daten der Client anfordert und wie/wie stark sich die Daten ändern.

edit: Angenommen, Sie benötigen wirklich den gesamten Datensatz und benötigen eine fortlaufende Simulation. Dann sollten Sie einen kontinuierlichen Prozess in Betracht ziehen, der das vollständige "Weltmodell" im Gedächtnis behält und mit diesem Modell bei jedem Lauf (Welt-Tick) arbeitet. Auf diese Weise müssten Sie die Daten nicht für jeden Tick laden. Aber ein solcher Prozess wird normalerweise in etwas anderem als PHP geschrieben.

+0

Zur Verdeutlichung sollten die Läufe im Hintergrund arbeiten und Daten verarbeiten, die den Benutzern angezeigt werden. - Wir benötigen die Daten jedes einzelnen Objekts für jeden einzelnen Lauf. - Wenn Benutzer die Schnittstelle anzeigen, ruft die Schnittstelle bestimmte XML-Dateien auf, um zu wissen, was angezeigt werden soll. - Keine Notwendigkeit für Gleichzeitigkeitsmechanismen - wir sind in Ordnung, denke ich. Durchsuchbarkeit ist alles gut und gut für die Benutzer, aber wäre die Verwendung der DB effizienter für den Hintergrund läuft? Das ist die aktuelle Sorge. – Polymeron

+0

Wenn es sich um einen Hintergrundprozess handelt, warum muss der gesamte Datensatz wiederholt gelesen/geladen werden? Wenn du sagst, dass du das tun musst, müssen wir dir wahrscheinlich glauben ;-) aber oft wird eine solche Frage in PHP-Foren gestellt, es läuft auf "Nein, du brauchst dafür keine (fast) kontinuierliche Simulation". Können Sie genauer auf das Dataset und die Operationen eingehen, die Sie bei jedem Lauf ausführen möchten? – VolkerK

+0

Dann würde ich versuchen, die Dateien oder zumindest die wiederholten Ladeoperationen loszuwerden. I.e. ein kontinuierlich ablaufender Prozess, der a) die Simulation durchführt, b) Anforderungen für Teilmengen der Daten annimmt und bedient und c) Anforderungen behandelt, um die Daten zu modifizieren. Anstatt also eine Datei (die als Datei auf dem Server gespeichert ist) hochzuladen, würde dieser Prozess die neuen Daten in sein Weltmodell integrieren (und es wahrscheinlich in einer Datenbank als Backup speichern). – VolkerK

Verwandte Themen