• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[DISKUSSION] PHP: Out of Memory und sein Allocated

SteelWheel

New member
Guten Morgen,

ich hab es gestern wieder geschafft, ein Stück aus meiner Tastatur heraus zu beißen. Denn wenn PHP mit "Out of Memory" und seinem "allocated"-Bytes Hinweis nach zirka 40 Sekunden Laufzeit in mein Browserfenster schreibt, dann schmeckt so ein Stück hochgezüchtetes Plastik sehr deliziös; erklärt aber auch den Tastaturbedarf per Jahr.

Also, das auslösende Script ist mehr als zehn Jahre alt und prozedural - ein wenig OOP schwingt mit (weil das schon Teile sind, die eben anders gebaut wurden). Es ist auf Linux wie auch Windows problematisch. In beiden Fällen steht das memory_limit auf 4095 (weil ich irgendwo gelesen hatte, dass 4096 nicht gehen würden - PHP 5.6 btw.)

Ich habe gestern noch Hände ringend nach Optimierungsmöglichkeiten gesucht, aber mir gehen die Ideen aus. So sind jetzt auch Sachen bspw. enthalten wie vorzeitig unset() bei bspw. Arrays.

Das Script funktioniert eigentlich nach einem reinen Include()-Prinzip: Die Hauptdatei mit zirka 1.300 Zeilen wird angestoßen und dann werden noch zirka 20 andere Dateien reingeholt, die ihrerseits wieder mächtig Zeilen haben. Es gibt leider nicht zu unterschätzende Abhängigkeiten (was bspw. direkt am Anfang zur Verfügung steht, muss am Ende auch noch da sein - darf nicht verworfen werden; den Teil vom Ende vorziehen geht aber nicht, weil wieder Bedingungen zuvor nötig usw.). Müsste ich das Script neu schreiben, benötige ich zirka zwei Tage - dann wäre es zwar total auf OOP, aber: Reicht das?

Ich habe am Datenvolumen noch gedreht - da kommt wirklich Kram aus der Datenbank (2 GB - aber nicht alles wird benötigt). Allerdings bekomme ich die Zahl auch nicht geringer bzgl. "allocated" (kein Erfolg mit den Maßnahmen ersichtlich oder noch viel zu weit weg).

Mir ist klar, dass ich mein prozedurales Zeug mit den includes() echt in die Tonne drücken muss (es ist schon sooo alt, lief beim letzten Einsatz vor drei Monaten auf der Linuxkiste aber noch).

Wie wäre es mit Multi-Threading? :D Die CPU Last liegt auf Linux bei 99 % auf einem Kern; Windows weiß ich jetzt gerade nicht mehr.

Mmmmhm ... mein Problem ist also: Lohnt sich der Aufwand in Richtung OOP? Wenn der sich nämlich jetzt schon so vollsaugt, warum sollte er das später nicht mehr machen? Das Datenvolumen ändert sich nicht - kann schlecht auf eine AS/400 ausweichen. :D

Wenn das ein OOP wäre, würde ich womöglich meine "Abhängigkeiten" natürlich weiterhin brauchen - diese aber anders "aufbewahren". Vielleicht doch lieber temporäre Tables? Externe, temporäre eigene Dateien?

Mir fehlt hier ein wenig "best practise", da ich so einen Fall noch nie hatte - wer jongliert also von euch mit großen Datenmengen und kann mir da einen Kniff vorschlagen, bevor ich mein Script umschreibe?!

Das wäre super - vielen Dank allen Wortmeldern.

Beste Grüße
 
Guten Morgen,

der Grund, dass das memory_limit derart beansprucht wurde, konnte behoben werden. Es handelte sich hierbei - na klar - um eine Datenmenge, die in der genutzten Form sogar ext. Tools für Datenbanken abstürzen ließ, wenn man das Feld editieren wollte. Ich musste dann aber tatsächlich diese "Menge" aus dem System entfernen. Es handelte sich dabei um eine umfangreiche Protokoll-Anhäufung, welche via serialize() abgespeichert wurde. Das hieraus dann entstandene Array ... hui ... sehr umfangreich! (aber offenbar bedingt durch eine Fehlfunktion beim Speichern)

Das Script selbst wird zwar immer noch umgeschrieben werden müssen (da ich heute so meine Scripte nicht mehr schreibe), allerdings sind die Anforderungen andere und der Termindruck weg.

Vielen Dank - zumindest fürs Lesen.
 
Zurück
Oben