783 Stimmen

Schwerwiegender Fehler: Erlaubte Speichergröße von 134217728 Bytes erschöpft (CodeIgniter + XML-RPC)

Ich habe eine Reihe von POS-Systemen (Point of Sale), die regelmäßig neue Verkaufsdaten an eine zentrale Datenbank senden, die die Daten zur Berichterstellung in einer großen Datenbank speichert.

Die Client-Kasse basiert auf PHPPOS, und ich habe ein Modul implementiert, das die Standard-XML-RPC-Bibliothek verwendet, um Verkaufsdaten an den Dienst zu senden. Das Serversystem basiert auf CodeIgniter und verwendet die XML-RPC und XML-RPCS Bibliotheken für die Webservice-Komponente. Immer wenn ich viele Verkaufsdaten sende (nur 50 Zeilen aus der Verkaufstabelle und einzelne Zeilen aus sales_items, die sich auf jeden Artikel innerhalb des Verkaufs beziehen), erhalte ich den folgenden Fehler:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 54 bytes)

128M ist der Standardwert in php.ini aber ich gehe davon aus, dass das eine große Zahl ist, die es zu knacken gilt. In der Tat habe ich sogar versucht, diesen Wert auf 1024M, und alles, was es tut, ist eine längere Zeit dauern, um Fehler aus.

Was die Schritte angeht, die ich unternommen habe, so habe ich versucht, alle Verarbeitungen auf der Serverseite zu deaktivieren, und ich habe es so eingerichtet, dass ich unabhängig von der Eingabe eine vorgefertigte Antwort erhalte. Ich glaube jedoch, dass das Problem in der tatsächlichen Übermittlung der Daten liegt. Ich habe sogar versucht, die maximale Skriptausführungszeit für PHP zu deaktivieren, und es tritt immer noch ein Fehler auf.

6 Stimmen

Ich bin etwas verwirrt... wo tritt der Fehler auf - im Client oder im Server? Und in welchem Stadium... Client sendet, Server empfängt, Server verarbeitet, Server sendet, Client empfängt oder Client verarbeitet?

0 Stimmen

Wie/wo setzen Sie das memory_limit auf 1024M?

3 Stimmen

Der Fehler scheint entweder beim Senden durch den Client oder beim Empfangen durch den Server aufzutreten. Ich habe versucht, die gesamte serverseitige Verarbeitung zu deaktivieren und den Server so einzustellen, dass er unabhängig von den gesendeten Daten eine Standardantwort sendet. Der Fehler tritt auf, wenn ich mehr als eine bestimmte Menge an Daten sende. Ich habe die PHP.ini-Einstellung geändert.

866voto

Jeff Punkte 8486

Ändern der memory_limit von ini_set('memory_limit', '-1'); est no eine angemessene Lösung. Bitte tun Sie das nicht.

Ihr PHP-Code könnte irgendwo ein Speicherleck haben, und Sie sagen dem Server, dass er einfach den gesamten Speicher verwenden soll. Damit hätten Sie das Problem überhaupt nicht behoben. Wenn Sie Ihren Server überwachen, werden Sie feststellen, dass er jetzt wahrscheinlich den größten Teil des Arbeitsspeichers verbraucht und sogar auf die Festplatte auslagert.

Sie sollten versuchen, den fehlerhaften Code in Ihrem Code aufzuspüren und ihn zu korrigieren.

222 Stimmen

@Jeff Sie haben wahrscheinlich in 95 % der Fälle Recht. Es gibt jedoch Zeiten, in denen Sie tatsächlich mehr Speicher benötigen. Nehmen wir zum Beispiel an, Ihre Anwendung lädt eine große Menge an Daten zur Verarbeitung in den Speicher (z. B. eine Stückliste mit 15k Komponenten). Es ist nicht immer der Fall, dass der Code fehlerhaft ist, manchmal braucht man einfach ein bisschen mehr Speicher (z.B. 256M statt 128M). Ich stimme jedoch zu, dass es furchtbar schlecht ist, den Wert auf -1 zu setzen. Aber die Anpassung des Speicherlimits für vernünftige Situationen zur Laufzeit ist imho vollkommen akzeptabel.

33 Stimmen

@pyrite ja Sie haben Recht, dass manchmal ein Prozess mehr Speicher benötigt, aber Sie sollten das Speicherlimit auf eine logische Menge wie 256MB wie Sie sagten oder 512MB warum nicht ABER nicht -1 erhöhen ;)

12 Stimmen

@jeff Ich stimme voll zu, ein Wert von -1 könnte nützlich sein nur in Entwicklungsumgebungen zu Testzwecken.

221voto

Chris Lane Punkte 3453

ini_set('memory_limit', '-1'); übersteuert den Standard PHP-Speicherbegrenzung .

1 Stimmen

Wo sollte man das ändern?! Ich finde diese Zeile nur in der php.ini

2 Stimmen

In bestimmten Situationen, in denen Sie unbedingt etwas abschließen und dann wieder auf eine vernünftige Einstellung zurückgehen müssen, ist dies sehr hilfreich.

20 Stimmen

@williamcarswell; -1 ist ein Wert, den PHP als unbegrenzt in diesem Zusammenhang.

170voto

Basav Punkte 2795

Der richtige Weg ist die Bearbeitung Ihrer php.ini Datei. bearbeiten memory_limit zu Ihrem Wunschwert.

Wie bei Ihrer Frage, 128M (das ist die Standardgrenze) überschritten wurde, ist etwas mit Ihrem Code nicht in Ordnung, denn es sollte nicht so viel brauchen.

Wenn Sie wissen, warum es so viel kostet und Sie es zulassen wollen, setzen Sie memory_limit = 512M oder höher und Sie sollten gut sein.

9 Stimmen

Wenn Sie wirklich große Datenmengen zwischenspeichern wollen, ist dies die richtige Antwort. 128M ist für bestimmte Skripte nicht genug. 512M oder 1024M sind oft genug, aber man muss von Fall zu Fall entscheiden.

4 Stimmen

Yeha, aber versuchen Sie, einen großen Speicherbedarf zu vermeiden, wenn die Anzahl der Benutzer größer ist

4 Stimmen

Memory_limit = -1 ; eingestellt in php.ini

116voto

Umair Idrees Punkte 1262

Die Speicherzuweisung für PHP kann permanent oder temporär angepasst werden.

Dauerhaft

Sie können die PHP-Speicherzuweisung auf zwei Arten dauerhaft ändern.

Wenn Sie Zugang zu Ihrem php.ini Datei, können Sie den Wert für memory_limit zu Ihrem Wunschwert.

Wenn Sie keinen Zugang zu Ihrem php.ini Datei (und Ihr Webhost erlaubt es), können Sie die Speicherzuweisung durch Ihre .htaccess Datei. hinzufügen php_value memory_limit 128M (oder die von Ihnen gewünschte Aufteilung).

Vorübergehend

Sie können die Speicherzuteilung in einer PHP-Datei spontan anpassen. Sie müssen lediglich den Code ini_set('memory_limit', '128M'); (oder die von Ihnen gewünschte Aufteilung). Sie können die Speicherbeschränkung aufheben (obwohl Maschinen- oder Instanzbeschränkungen weiterhin gelten können), indem Sie den Wert auf "-1" setzen.

3 Stimmen

Danke, ich habe nicht gedacht, um zu überprüfen, ob jemand den Wert in .htaccess gesetzt hatte, die php.ini überschrieben wurde und ich konnte nicht herausfinden, warum +1

0 Stimmen

Für alle, die vorübergehend mit Befehlen arbeiten müssen: php -d memory_limit=256M your_php_file.php o php -d memory_limit=256M artisan ...

70voto

troelskn Punkte 110542

In einem PHP-Skript kann es sehr leicht zu Speicherlecks kommen - vor allem, wenn Sie eine Abstraktion, wie z. B. ein ORM, verwenden. Versuchen Sie, mit Xdebug ein Profil Ihres Skripts zu erstellen und herauszufinden, wo der ganze Speicher hin ist.

2 Stimmen

Ich werde Xdebug ausprobieren. Ich habe es noch nie benutzt, also werde ich mich darüber informieren müssen. Vielen Dank für Ihre Antwort! Hoffentlich finde ich bald eine Antwort darauf...

36 Stimmen

Denken Sie daran, dass PHP zur Verwaltung des Speichers die Referenzzählung verwendet. Wenn Sie also zirkuläre Referenzen oder globale Variablen haben, werden diese Objekte nicht wiederverwendet. Das ist in der Regel die Ursache für Speicherlecks in PHP.

0 Stimmen

Xdebug zeigt, dass CIs Xmlrpc.php-Bibliothek für mein Speicherleck verantwortlich ist. Gibt es zufällig irgendwelche Probleme mit den XML-RPC-Bibliotheken von CodeIgniter, von denen ich wissen sollte? Ich habe versucht, die gesamte Verarbeitung serverseitig zu deaktivieren, und es läuft immer noch aus dem Speicher, wenn ich es genug Daten füttere.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X