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%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
wechselnZitat 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
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
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.
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')
Verbessern Sie den Code, um nur die erforderlichen Informationen zu verarbeiten.