Frage

Wir haben eine große Management-Software, die große Berichte aller Art produziert, basierend auf zahlreichen Schleifen, mit Datenbank-Abfragen, Objekte Kreationen (viele), und so weiter.

Auf PHP4 es glücklich mit einer Speichergrenze von 64 MB laufen kann - jetzt haben wir es auf einen neuen Server und mit der gleichen Datenbank verschoben - gleichem Code, die gleichen Berichte werden ohne Gig Speicherlimit nicht kommen. ..

Ich weiß, dass PHP5 unter der Haube eine ganze Menge Dinge geändert hat, aber ist es eine Möglichkeit, es verhält sich zu machen?

Die Frage am Ende ist, welche Strategien gelten Sie, wenn Sie Ihre Skripte auf eine Diät haben müssen?

War es hilfreich?

Lösung

Ein großes Problem, das wir in laufen haben wurde zirkuläre Verweise zwischen Objekten zu stoppen sie aus dem Gedächtnis zu befreien, wenn sie sich außerhalb des Geltungsbereichs werden.

Je nach Architektur können Sie in der Lage sein __destruct () zu verwenden und manuell ungesetzt alle Verweise. Für unser Problem endete ich die Klassen Umstrukturierung und die zirkulären Referenzen zu entfernen.

Andere Tipps

Wenn ich brauche Ressourcen auf jedem Skript zu optimieren, ich versuche immer, zu analysieren, Profil und debuggen meinen Code, ich verwende xDebug und der xDebug Profiler , gibt es andere Optionen wie APD und Benchmark Profiler .

Darüber hinaus empfehle ich Ihnen diese Artikel:

auf den neuen Server Seit dem Umzug haben Sie überprüft, dass Ihre MySQL und PHP Systemvariablen auf die Art und Weise identisch sind sie auf dem alten Server waren?

PHP5 eingeführt viele neue Funktionalität, sondern aufgrund seiner Abwärtskompatibilität Mantra, ich glaube nicht, dass die Unterschiede zwischen PHP5 und PHP4 sollte diese große verursachen einen Einfluss auf die Leistung einer Anwendung, die Code ist und Datenbank war nicht geändert.

Sind Sie auch auf der gleichen Version von Apache oder IIS ausgeführt wird?

Es klingt wie ein Problem, das eher zu Ihrer neuen Systemumgebung verwendet ist als mit einem Upgrade von PHP4 bis 5.

Bertrand,

Wenn Sie in Refactoring den vorhandenen Code interessiert sind, dann würde ich empfehlen, dass Sie zuerst Ihre CPU und Speicherauslastung überwachen, während Berichte ausführen. Sind Sperren Sie Ihren SQL Server oder sind Sperren Sie Apache (die, wenn eine Menge Stress passiert, wird durch den PHP-Code auf das System gebracht zu werden)?

ich an einem Projekt gearbeitet, das zunächst MySQL verzetteln so stark, dass wir den gesamten Bericht Erzeugungsprozess Refactoring hatte. Wenn wir jedoch die Last fertig war einfach zu Apache (durch den komplexeren PHP-Code) übertragen. Unsere endgültige Lösung war es, das Datenbank-Design, Refactoring für eine bessere Performance für Reporting-Funktionen zur Verfügung zu stellen und PHP zu verwenden, die Flaute auf abholen, was wir nicht nativ in MySQL tun könnten.

über die Art der Berichte Je Sie die Daten prüfen könnte Denormalisierung, die für die Berichte verwendet wird. Sie sollten erwägen sogar eine zweite Datenbank erstellt, die als Data Warehouse dient und um OLAP-Prinzipien konzipiert ist eher als OLTP Prinzipien. Sie können für eine allgemeine Erklärung von OLAP und Data Warehousing bei Wikipedia starten.

Bevor Sie jedoch ernsthaft Refactoring beginnen suchen, haben Sie festgestellt, dass Ihre Umgebungen, indem man phpinfo ausreichend ähnlich sind (); für PHP und SHOW VARIABLES; in MySQL?

Ein Konzert!?!

sogar 64 MB groß ist.

die Diskrepanz zwischen den Umgebungen zu ignorieren, (was sehr eigenartig klingt), es klingt wie der Code kann einiges Refactoring benötigen.

eine Chance, können Sie Faktor Code erneut, so dass die Ergebnismengen von Datenbankabfragen werden in Arrays nicht abgeladen. Ich würde empfehlen, dass Sie einen Iterator für Ihre Ergebnismengen zu konstruieren. (Von dort können Sie sie als Array behandeln für die meisten Zwecke) .there ein großer Unterschied zwischen der Handhabung eines Datensatz zu einem Zeitpunkt, und Umgang mit 10.000 Datensätze auf einmal.

zweitens haben einen Blick auf Wetter Code mehrere Instanzen der Daten erstellt. Können Sie die Objekte durch Verweis übergeben. (Verwenden Sie die '&'). Wir hatten eine ähnliche Sache zu tun, wenn eine frühe Variante der Horde Framework. eine 1 MB Befestigung an 50MB würde aus zahlreichen Anrufen ausblasen, die den gesamten Datensatz als Kopie übergeben, anstatt als Referenz.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top