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.

2voto

Fred Noriega Punkte 359

Wenn Sie einen VPS (Virtual Private Server) mit WHM betreiben, haben Sie möglicherweise keine Berechtigung, die PHP.INI direkt zu bearbeiten; dies muss das System tun. Gehen Sie im WHM-Host-Kontrollpanel zu Dienst-KonfigurationPHP-Konfigurations-Editor und ändern memory_limit :

Updating memory_limit on WHM 11.48.4

0voto

Dmitriy Kravchuk Punkte 466

In meinem Fall war es ein kurzes Problem mit der Art und Weise, wie eine Funktion geschrieben wurde. Ein Speicherleck kann durch die Zuweisung eines neuen Wertes an die Eingangsvariable einer Funktion verursacht werden, z. B.:

/**
* Memory leak function that illustrates unintentional bad code
* @param $variable - input function that will be assigned a new value
* @return null
**/
function doSomehting($variable){
    $variable = 'set value';
    // Or
    $variable .= 'set value';
}

-1voto

Hossein Azad Punkte 114

Ändern ;memory_limit=512M zu ;memory_limit=-1 sur enter image description here

es ist zu gefährlich für einen Server Ihr PHP-Code könnte irgendwo ein Speicherleck haben, und Sie sagen dem Server, er solle einfach so viel Speicher verwenden, wie er will. 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.

-1voto

Juan Pablo G Punkte 731

Ich verbrachte zwei Tage mit der Suche nach einer Lösung für dieses Problem und fand heraus, dass dies in einem Aufruf mit PDO verursacht wurde, als ich

$stmt->bindParam(":PERIOD", $period); 

und der Zeitraum der Variablen war ein

empty string ''

Also dieses Problem könnte mehrere Ursachen haben, ist mein Rat an Sie, dass ein Versuch und Irrtum oder eine Halbierung Methode für eine Ursache zu finden, löschen Sie Code und die versuchen zu suchen, was ist die Zeile Code, der fehlschlägt

Update: Ich konfrontiert auch diesen Fehler mit der Methode $pdo->query() Ich habe $pdo->prepare() und funktionierte gut, so, während ich hatte

$sql = "SELECT * FROM COURSE_DETAILS where ACTIVE = 1 AND COURSE_DETAILS_ID = $id";
$stmt = getConnection()->query($sql);
$courseDetails = $stmt->fetchAll(PDO::FETCH_ASSOC)

dann habe ich dies geändert in

$sql = "SELECT * FROM COURSE_DETAILS where ACTIVE = 1 AND COURSE_DETAILS_ID = ?";
$stmt = getConnection()->prepare($sql);
$stmt->execute(array($id)); 

und wie von Zauberhand war der Speicherfehler verschwunden!

-1voto

Hmerman6006 Punkte 914

Diese Frage wurde vor einigen Jahren gestellt, und obwohl mein Sachverhalt nicht derselbe ist, erhielt ich vor kurzem diesen Fehler beim Parsen einer HTML-Tabelle auf dem Server innerhalb einer Schleife. Der Grund für den Fehler war, dass die Html-Datei mit doppelten Anführungszeichen geparst wurde, die mit einer Variablen verkettet wurden $table bei gleichzeitiger Verkettung mehrzeiliger Zeichenketten.

$table = "<table>\n";
    $table .= "<tbody>\n";
        foreach ($data as $item) {
            $table .= "<tr>\n";
                // this caused the Fatal Error: Allowed Memory Size of 134217728 Bytes Exhausted
                $table .= "<td>$item->description</td><td>$item->qty</td>" .  
                $table .= "<td>$item->price_incl</td><td>$item->price->vat</td>" .
                $table .= "<td>$item->price_excl</td><td>$item->available</td>" .
            $table .= "</tr>\n";
        }
    $table .= "</tbody>";
$table .= "</table>\n";

Der obige Fehler kam mir seltsam vor, aber wenn man bedenkt, dass ich die Zeichenfolge bereits mit der $table Es erscheint mir jetzt dumm, dass ich das versucht habe. Die Lösung bestand darin, entweder die Variablenkonkatenation in den Zeilen 7 und 8 zu entfernen oder das Symbol für die Endzeilenverkettung aus den Zeilen 6, 7 und 8 zu entfernen.

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