Sven Rautenberg: Fatal error: Allowed memory size of 52428800 bytes exhausted

Beitrag lesen

Und falls ja: Ich weiß nicht, wie effizient (hier: speichersparend) file() arbeitet. Aber wenn eine Datei überwiegend sehr kurze Zeilen enthält, wird die Speicherung als Array sehr viel mehr Platz brauchen als eben die reine Dateigröße.

Ein PHP-Arrayelement benötigt 144 Byte Speicherplatz. Bei Strings zusätzlich noch den Speicher für die Bytes dieses Strings (Integer, Floats oder Booleans sind in den 144 Byte schon enthalten).

Obendrauf kommt noch Overhead für das Array selbst, sowie ein wenig Platz für eventuell hinzukommende Elemente, die in der Hashtable schon mal reserviert, aber noch nicht gefüllt werden.

Aus dieser Information ergibt sich, dass mit dem verfügbaren Speicher maximal 364088 Arrayelemente möglich sind - abzüglich des Platzes für die Strings der Textdatei.

Mit anderen Worten: Wenn die Datei nur 9 MB groß ist, ist es viel schlauer, sie als String einzulesen, oder eventuell auch GAR NICHT komplett in den Speicher zu legen.

Denn mit "SplFileObject" gibts in PHP die Möglichkeit, sich einfach ein iterierbares Objekt zu erzeugen, dass dann die Datei nach und nach durchliest, man das aber nicht explizit programmieren muss.

Anstatt $inhalt = file($upload . "/" . $showfile); wäre der geeignete Ersatz $inhalt = new SplFileObject($upload . "/" . $showfile);

- Sven Rautenberg