Erlaubte Speichergröße von 134217728 Byte erschöpft (versucht, 4294967296 Byte zuzuweisen)

7

Mein Projekt verwendet eine Open Source PHP MySQL-Bibliothek Ссылка

Aber das Projekt Mitte des Jahres Bericht: "Schwerwiegender Fehler: Erlaubte Speichergröße von 134217728 Bytes erschöpft (versuchte, 4294967296 Bytes zuzuordnen) in / home1 / flipalbu / public_html / kvisofttest / login-admin / Lib / Klasse.MysqliDb.php in Zeile 422 "Dieser Fehler,

Mein Server ist: linux x86_64

PHP Version 5.4.17

Mysql Version: 5.5.32

memory_limit = 128M

Zeile 422: call_user_func_array (array ($ stmt, 'bind_result'), $ parameters);

Frage Teil des Codes:

%Vor%

Gibt es eine Möglichkeit, es zu lösen?

/ ** Fehlercode ** /

%Vor%     
user2637147 08.08.2013, 08:44
quelle

4 Antworten

20

Ich habe diesen Fehlerbericht hier gelesen: Ссылка

Ihr Problem scheint zu passieren, weil in den Spalten der Tabelle ein longblob oder longtext vorhanden ist.

longtext / longblob haben eine maximale Länge von 4294967295 [4GB] Deshalb versucht mysqli diesen Speicher für den Puffer zu reservieren, um sicherzugehen, dass nichts verloren geht. Ich würde vorschlagen, dass du mediumtext (16777215 [16MB] maximale Länge) verwendest, das sollte normalerweise für alles ausreichen.

Aktualisierung: Weil diese Antwort einige Aktivität gesehen hat, füge ich diese Lösung von Phil_1984 hinzu (siehe Kommentare)

  

Ich benutze mysqli und nachdem ich dieses Zitat von php dev gelesen habe, a   $ stmt- & gt; store_result (); zwischen execute und bind_result scheint zu beheben   die Probleme für mich

= & gt; Wenn Sie $stmt->store_result() verwenden, können Sie mysqli mit longblob / longtext verwenden, ohne dass der Fehler auftritt.

-

Alte Antwort: Ich schlage vor, dass Sie entweder die Spalte zu einem anderen Typ ändern (Mediumtext) oder PDO verwenden (ich denke, dass es dieses Problem nicht hat). aber wenn Sie die Spalte als longtext beibehalten möchten, müssen Sie Ihre mysql-Bibliothek

wechseln

Zitat von PHP Dev:

  

Dies ist eine bekannte Einschränkung von ext / mysqli bei der Verwendung von libmysql (immer   in 5.2 und vorherigen) und wenn libmysql mit 5.3 aktiviert ist. Das   Grund ist, dass der Server nicht zu spezifische Metadaten über die   Säule. Dieser Longtext hat eine maximale Länge von 4G und ext / mysqli versucht es   bind mit der maximalen Länge, um sicherzugehen, dass kein Datenverlust auftritt (Daten nicht)   passt in den Bindepuffer auf C-Ebene). Dies bedeutet jedoch 4G für eine   Longtext- / Longblob-Spalte. ext / mysqli wurde geändert, um einen Weg zu finden   umgehen Sie das. Sie müssen mysqli_stmt_store_result () aufrufen   speichert die Daten lokal, was natürlich einen höheren Speicher bedeutet   Verwendung für PHP. Da Sie libmysql verwenden, trifft dies jedoch nicht auf   Die Speichergrenze von PHP ist sicher. Während store_result ist die max_length von   Jede Spalte wird berechnet und dann, wenn bind_result ausgeführt wird   nur ein Puffer mit der Größe von max_length wird zugewiesen, was sein wird   definitiv niedriger als 4G. Kurz gesagt, bereiten Sie execute store_result vor   bind_result fetch ... holen ... holen

    
x4rf41 08.08.2013 08:58
quelle
4

Wenn Sie versuchen, eine ganze Tabelle auf einmal einzulesen, und diese Tabelle viele Zeilen und Spalten enthält, ist der Speichermangel unvermeidlich. Sie können es abstellen, indem Sie das Speicherlimit in der php.ini erhöhen, aber das Problem tritt erst wieder auf, wenn Sie ein paar tausend weitere Zeilen hinzufügen.

Sie müssen Ihr Skript neu schreiben, um sinnvoller zu sein, was es abruft. Wenn Sie nur bestimmte Datensätze benötigen, dann ist es schrecklich ineffizient, die gesamte Tabelle abzuziehen und nach der / den gewünschten Zeile (n) in der Ergebnismenge zu suchen. Verwenden Sie eine WHERE-Klausel, um anzugeben, was Sie wirklich erhalten möchten. Die Faustregel bei PHP / SQL-Anwendungen ist "Verwenden Sie SQL, wo immer es möglich ist, um anzugeben, was Sie wollen, und tun Sie dann, was Sie damit in PHP machen müssen".

Natürlich kann es sein, dass es einen völlig legitimen Grund gibt, warum Sie eine ganze Tabelle in PHP verarbeiten müssen. In diesem Fall sollten Sie die Daten in Blöcken (sagen wir 100 Zeilen) mit LIMIT und OFFSET abholen, diese Zeilen verarbeiten, den nächsten Chunk holen, diese verarbeiten und so weiter, bis Sie die gesamte Tabelle durchlaufen haben. Das wird viel weniger Speicher als versuchen, die gesamte Tabelle auf einmal zu laden

    
GordonM 08.08.2013 08:52
quelle
1

Sieht nicht wie ein riesiger Tisch aus! Scheint wie eine Endlosschleife! Es versucht, etwa 4 GB zu reservieren, ich glaube nicht, dass Sie einen so großen Tisch haben ....

überprüfen Sie, dass Sie hier keine Schleife erstellen:

%Vor%

vielleicht sollten Sie den Code um diese Zeile posten.

    
Patrick Brösamle 08.08.2013 08:56
quelle
0

Sie überschreiten den maximal verfügbaren Speicher. Sie haben zwei Möglichkeiten:

  • Erhöhen Sie den maximal zulässigen Speicher für jedes PHP-Skript entweder durch Konfiguration ( memory_limit Direktive in php.ini ) oder in Ausführungszeit, indem Sie ini_set('memory_limit', '200M')

  • verwenden
  • Verbessern Sie den Code, um nur die erforderlichen Informationen zu verarbeiten.

vicentazo 08.08.2013 08:58
quelle

Tags und Links