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.

62voto

JamesAD-0 Punkte 715

Beim Hinzufügen von 22,5 Millionen Datensätze in ein Array mit array_push erhielt ich immer "Speicher erschöpft" fatale Fehler bei rund 20M Datensätze mit 4G als Speichergrenze in der Datei php.ini. Um dies zu beheben, habe ich die Anweisung

$old = ini_set('memory_limit', '8192M');

am Anfang der Datei. Jetzt funktioniert alles einwandfrei. Ich weiß nicht, ob PHP ein Speicherleck hat. Das ist nicht meine Aufgabe, und es interessiert mich auch nicht. Ich muss nur meine Arbeit erledigen, und das hat funktioniert.

Das Programm ist sehr einfach:

$fh = fopen($myfile);
while (!feof($fh)) {
    array_push($file, stripslashes(fgets($fh)));
}
fclose($fh);

Der fatale Fehler bezieht sich auf Zeile 3, bis ich die Speicherbegrenzung erhöht habe, was den Fehler den Fehler beseitigte.

10 Stimmen

Sie meinen ini_set('memory_limit', '8192M'); ?

8 Stimmen

Was für ein Luxus wäre es, Zeit zu haben, ein Skript für so etwas zu optimieren. Oder ETL-Tools zu erforschen, zu vergleichen und zu erlernen oder ähnliches. In der realen Welt schrauben wir die Speicherzugabe in die Höhe, erledigen die Sache und machen weiter.

2 Stimmen

22 Millionen Datensätze

50voto

Danny Beckett Punkte 19352

Ich bekam immer wieder diese Fehlermeldung, sogar mit memory_limit sich einstellen php.ini und das korrekte Auslesen des Wertes mit phpinfo() .

Indem wir es von diesem ändern:

memory_limit=4G

Zu diesem:

memory_limit=4096M

Damit wurde das Problem in PHP 7 behoben.

26voto

Derick Fynn Punkte 375

Sie können das Problem beheben, indem Sie die memory_limit auf fastcgi/fpm:

$vim /etc/php5/fpm/php.ini

Ändern Sie den Speicher, z. B. von 128 auf 512, siehe unten.

; Maximum amount of memory a script may consume (128 MB)
; http://php.net/memory-limit
memory_limit = 128M

zu

; Maximum amount of memory a script may consume (128 MB)
; http://php.net/memory-limit
memory_limit = 512M

25voto

Gaurang P Punkte 1938

Das Root-Verzeichnis Ihrer Website:

ini_set('memory_limit', '1024M');

2 Stimmen

Das hat bei mir funktioniert. Ich liebe einzeilige Lösungen. +1 für Einfachheit

24voto

Kristen Waite Punkte 1355

Wenn Sie die obige Fehlermeldung sehen - insbesondere wenn die (tried to allocate __ bytes) ein niedriger Wert ist, könnte das ein Indikator für eine Endlosschleife sein, z. B. eine Funktion, die sich selbst aufruft, ohne dass es einen Ausweg gibt:

function exhaustYourBytes()
{
    return exhaustYourBytes();
}

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