Zulässige Speichergröße von 33554432 Bytes erschöpft (versucht, 43148176 Bytes zuzuweisen) in PHP

279

Diese Fehlermeldung wird angezeigt, irgendwelche Vorschläge?

Zulässige Speichergröße von 33554432 Bytes erschöpft (versucht, 43148176 Bytes zuzuweisen) in PHP

Panidarapu
quelle
5
Erhöhen Sie Ihr maximales Speicherlimit in Ihrer php.ini-Datei auf 64 MB. Google-Suche Aber könnte ich fragen, warum Sie versuchen, so viel Speicher zuzuweisen? In welcher Codezeile schlägt es fehl?
1
Was macht das Skript, wenn es fehlschlägt? Kannst du den Code posten?
Neil Aitken
3
Sieht aus wie eine sehr große txt-Datei.
Macbirdie
10
Herkömmlicherweise lesen Sie zeilenweise Dateien mit potenziell großer oder beliebiger Größe und überschreiben bei jeder gelesenen Zeile den vorherigen Zeilenspeicher. Oder Sie möchten die Datei einfach nur verfolgen oder leiten, um die neuesten Einträge zu erhalten. Es ist nicht die Antwort, die Speicherzuordnung zu erhöhen, wenn die Datei wächst.
ekerner

Antworten:

317

Endlich fand ich die Antwort:

Fügen Sie dies einfach in die folgende Zeile ein, bevor Sie einen Fehler in Ihrer Datei erhalten

ini_set('memory_limit', '-1');

Es wird unbegrenzte Speichernutzung des Servers erfordern, es funktioniert gut.

Vielen Dank für Ihre Vorschläge Freunde.

Panidarapu
quelle
125
Sie sollten immer noch überprüfen, warum der Speicher erschöpft ist. Möglicherweise müssen Sie nicht die gesamte Datei lesen, sondern sie möglicherweise nacheinander lesen.
Macbirdie
8
- @panidarapu und @Don Jones: Abhängig von der Größe des Speichers, und wie dieses Skript verwendet wird, könnte es gefährlich sein , die Änderung der Speicherverbrauch auf diese Weise zu ermöglichen. In Ihrem Fall können Sie den Feed wahrscheinlich in kleinere Teile zerlegen und analysieren, was Sie benötigen. Ich bin froh, dass es funktioniert, aber sei vorsichtig.
Anonymer Feigling
5
Dieser Vorschlag hat bei mir funktioniert. Das dynamische Erhöhen des Speicherlimits im Skript erfolgt über die Funktion ini_set (): ini_set ('memory_limit', '128M');
Mente
37
Leute, bitte macht diese schnelle Lösung nicht. Es kann dich auf lange Sicht verletzen. Als guter Programmierer sollten Sie den Grund für diesen Speicherverbrauch herausfinden und nach Bedarf erhöhen, anstatt ihn beizubehalten UNLIMITED.
Sumoanand
113
Wow, diese massiv positiv bewertete Antwort scheint mir eine wirklich schlechte Praxis zu sein. -1!
Ambidex
59

Hier sind zwei einfache Methoden, um das Limit für Shared Hosting zu erhöhen:

  1. Wenn Sie Zugriff auf Ihre PHP.ini-Datei haben, ändern Sie die Zeile in PHP.ini. Wenn in Ihrer Zeile 32 Millionen angezeigt werden, versuchen Sie es mit 64 Millionen: memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)

  2. Wenn Sie keinen Zugriff auf PHP.ini haben, fügen Sie dies einer .htaccess-Datei hinzu: php_value memory_limit 64M

Haider Abbas
quelle
47

Ihr Skript verwendet zu viel Speicher. Dies kann in PHP häufig vorkommen, wenn Sie eine außer Kontrolle geratene Schleife haben und bei jedem Durchgang der Schleife Objekte erstellen oder Arrays hinzufügen.

Suchen Sie nach Endlosschleifen.

Wenn dies nicht das Problem ist, versuchen Sie, PHP zu helfen, indem Sie Objekte zerstören, mit denen Sie fertig sind, indem Sie sie auf null setzen. z.B.$OldVar = null;

Überprüfen Sie den Code, in dem der Fehler tatsächlich auftritt. Würden Sie erwarten, dass diese Zeile eine enorme Menge an Speicher reserviert? Wenn nicht, versuchen Sie herauszufinden, was schief gelaufen ist ...

Rik Heywood
quelle
3
Ich hatte genau dieses Problem - es stellte sich heraus, dass ich versehentlich eine rekursive Funktion erstellt hatte - und daher ging zu jedem zufälligen Zeitpunkt während der Codeausführung der Speicher aus. Dies hatte den Vorteil, dass ich jetzt den speichereffizientesten Code der Welt habe, der auf der Suche nach einem Speicherverlust erstellt wurde.
Kris Selbekk
1
Für andere, die ein Kaninchen in ein Loch jagen. Doctrine in Symfony Ich denke, es gibt ein Problem mit Monolog. Wenn es eine PDO-Ausnahme gibt, wird eine Endlosschleife von Ausnahmen erstellt, da eine Ausnahme für die Ausnahme versucht wird, wodurch das eigentliche Problem (eine beschädigte Datenbankdatei in meinem Fall) ausgeblendet wird.
Desislav Kamenov
39

Tun :

ini_set('memory_limit', '-1');

ist niemals gut Wenn Sie eine sehr große Datei lesen möchten, empfiehlt es sich, sie Stück für Stück zu kopieren. Versuchen Sie den folgenden Code für Best Practice.

$path = 'path_to_file_.txt';

$file = fopen($path, 'r');
$len = 1024; // 1MB is reasonable for me. You can choose anything though, but do not make it too big
$output = fread( $file, $len );

while (!feof($file)) {
    $output .= fread( $file, $len );
}

fclose($file);

echo 'Output is: ' . $output;
Delali
quelle
6
Ich kann nicht glauben, dass all diese Leute empfehlen, memory_limit auf -1 zu setzen ... Verrückte Sache auf einem Produktionsserver. Vielen Dank für eine viel sauberere Lösung.
John Wolf
2
Bei "Best Practice" ist es gut, den Datei-Handler nach der whileSchleife zu schließen:fclose($file)
Kodeart
2
@assetCorp Wie hilft das, vorausgesetzt die Datei hat zum Beispiel 100MiB und das PHP-Speicherlimit ist immer noch auf 32 MiB eingestellt. Sie lesen es durch sichere Blöcke von 1 MB, hängen es dann aber an eine Variable an, die den gesamten verfügbaren Speicher verwendet, sobald die Schleife die 31. Iteration erreicht. Wie ist es besser? Nur die Ausgabe der Chunks, um nicht alle in einer Variablen zu speichern, würde zur Lösung des Problems beitragen.
Helvete
17

Es ist leider einfach, in PHP so zu programmieren, dass Speicher schneller verbraucht wird, als Sie denken. Das Kopieren von Zeichenfolgen, Arrays und Objekten anstelle von Referenzen reicht aus, obwohl PHP 5 dies automatischer als in PHP 4 tun soll. Der vollständige Umgang mit Ihrem Datensatz über mehrere Schritte ist jedoch auch verschwenderisch im Vergleich zur Verarbeitung der kleinsten logischen Einheit zu einer Zeit. Das klassische Beispiel ist das Arbeiten mit großen Ergebnismengen aus einer Datenbank: Die meisten Programmierer rufen die gesamte Ergebnismenge in ein Array ab und durchlaufen sie dann ein- oder mehrmals mit foreach(). Es ist viel speichereffizienter, eine while()Schleife zu verwenden, um jeweils eine Zeile abzurufen und zu verarbeiten. Gleiches gilt für die Verarbeitung einer Datei.

staticsan
quelle
Es scheint ziemlich wahrscheinlich, dass dies das ist, was es tut.
Kzqai
13

Wenn Sie große Dateien lesen möchten, sollten Sie sie Stück für Stück lesen, anstatt sie sofort zu lesen.
Es ist ganz einfach: Wenn Sie eine 1 MB große Datei gleichzeitig lesen, wird mindestens 1 MB Speicher gleichzeitig benötigt, um die Daten zu speichern.

Sie sollten sie also Stück für Stück mit fopen& lesen fread.

Gumbo
quelle
1
Gelöst durch:$fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
Kai Noack
12

Ich habe das gleiche Problem in PHP7.2 mit Laravel 5.6 gehabt. Ich erhöhe nur die Anzahl der Variablen memory_limit = 128Min php.ini, wie es meine Anwendungen erfordern. Es könnte 256M / 512M / 1048M sein ..... Jetzt funktioniert es gut.

Ziaur Rahman
quelle
6

Ich hatte auch das gleiche Problem, suchte erfolglos nach phpinfo.ini, php.ini oder .htaccess-Dateien. Schließlich habe ich mir einige PHP-Dateien angesehen, sie geöffnet und die darin enthaltenen Codes auf Speicher überprüft. Schließlich war diese Lösung das, was ich herausgebracht habe und es hat für mich funktioniert. Ich habe WordPress verwendet, daher funktioniert diese Lösung möglicherweise nur bei Problemen mit der Speicherbeschränkung für WordPress. Meine Lösung: Öffnen Sie die Datei default-constants.php im Ordner / public_html / wp-includes . Öffnen Sie diese Datei mit dem Code-Editor und suchen Sie die Speichereinstellungen im wp_initial_constantsBereich oder drücken Sie einfach Strg + F, um das Wort "Speicher" zu finden. Dort kommst du rüber WP_MEMORY_LIMITund WP_MAX_MEMORY_LIMIT. Erhöhen Sie es einfach, es war 64 MB in meinem Fall, ich habe es auf 128 MB und dann auf 200 MB erhöht.

// Define memory limits.
if ( ! defined( 'WP_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MEMORY_LIMIT', $current_limit );
    } elseif ( is_multisite() ) {
        define( 'WP_MEMORY_LIMIT', '200M' );
    } else {
        define( 'WP_MEMORY_LIMIT', '128M' );
    }
}

if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } elseif ( -1 === $current_limit_int || $current_limit_int > 268435456 /* = 256M */ ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } else {
        define( 'WP_MAX_MEMORY_LIMIT', '256M' );
    }
}

Übrigens, bitte machen Sie nicht den folgenden Code, weil das eine schlechte Praxis ist:

ini_set('memory_limit', '-1');
garakchy
quelle
1
Funktioniert für WordPress-Websites, auf denen für .htaccess- und php.ini-Dateien kein Zugriff verfügbar ist. +1
Mustafa Sabir
Ich würde sagen, dass es keine gute Idee ist, diese Grenzwerte für eine 'Kern'-WordPress-Datei zu ändern. Sie können diese Grenzwerte so einfach hinzufügen wp-config.php, dass sie durch zukünftige WordPress-Updates nicht überschrieben werden. Außerdem werden sich einige Sicherheits-Plugins (wie zum Beispiel WordFence) beschweren, wenn 'Kern'-WordPress-Dateien geändert werden ...
Gwyneth Llewelyn
1
@GwynethLlewelyn Ich weiß nicht, wie ich das machen soll. Kannst du das bitte näher erläutern?
Garakchy
1
Oh ... bearbeiten wp-config.phpund fügen Sie einfach die beiden Zeilen dort hinzu (d. H. define( 'WP_MEMORY_LIMIT', '200M' );Und define( 'WP_MAX_MEMORY_LIMIT', '256M' );. Im Gegensatz zu den Dateien auf dem ' Kern' -WP (nämlich alles unter wp-includes), die durch WP-Upgrades überschrieben werden, wp-config.phpnicht - es ist genau dafür da der genaue Zweck des Überschreibens von WP-Konstanten!
Gwyneth Llewelyn
1
"schlechte Praxis" ist situativ. -1ist gut für kurzfristige Prozesse. Zum Beispiel ein PHP-Builder-Container, der zum Ausführen von Komponententests oder zur Installation von / etc. Führen Sie Ihre Produktionsstätte nur nicht so aus.
Emmdee
5

Sie können den für PHP-Skripte zulässigen Speicher erhöhen, indem Sie die folgende Zeile über allen Codes im Skript ausführen:

ini_set('memory_limit','-1'); // enabled the full memory available.

Und ordnen Sie auch die unerwünschten Variablen im Skript zu.

Überprüfen Sie diese PHP-Bibliothek: Speicher mit PHP freigeben

Sanjay Kumar NS
quelle
4
ini_set('memory_limit', '-1');
Nnh Nguyễn Thế
quelle
3
@Pang ini_set ('memory_limit', '-1');
DIGITALCRIMINAL
3

Ich stelle fest, dass viele Antworten nur versuchen, die Menge an Speicher zu erhöhen, die einem Skript zugewiesen wird, das seinen Platz hat, aber meistens bedeutet dies, dass etwas aufgrund einer unvorhergesehenen Menge an Volumen oder Größe zu liberal mit Speicher ist. Wenn Sie nicht der Autor eines Skripts sind, sind Sie natürlich dem Autor ausgeliefert, es sei denn, Sie fühlen sich ehrgeizig :) Die PHP-Dokumente sagen sogar, dass Speicherprobleme auf " schlecht geschriebene Skripte " zurückzuführen sind.

Es sollte erwähnt werden, dass ini_set('memory_limit', '-1');(keine Begrenzung) Serverinstabilität verursachen kann als 0 bytes free = bad things. Finden Sie stattdessen ein angemessenes Gleichgewicht zwischen dem, was Ihr Skript versucht, und der Menge des verfügbaren Speichers auf einem Computer.

Ein besserer Ansatz: Wenn Sie der Autor des Skripts sind (oder ehrgeizig), können Sie solche Speicherprobleme mit xdebug debuggen . Die neueste Version (2.6.0 - veröffentlicht am 29.01.2018) brachte eine Speicherprofilerstellung zurück, die zeigt, welche Funktionsaufrufe viel Speicher verbrauchen. Es zeigt Probleme im Skript auf, die sonst schwer zu finden sind. Normalerweise befinden sich die Ineffizienzen in einer Schleife, die das empfangene Volumen nicht erwartet, aber jeder Fall wird dem Leser als Übung überlassen :)

Die xdebug-Dokumentation ist hilfreich, besteht jedoch aus drei Schritten:

  1. Installieren Sie es - Verfügbar über apt-getund yumetc.
  2. Konfigurieren Sie es - xdebug.ini : xdebug.profiler_enable = 1,xdebug.profiler_output_dir = /where/ever/
  3. Zeigen Sie die Profile in einem Tool wie QCacheGrind , KCacheGrind an
SeanDowney
quelle
2

Wenn Sie versuchen, eine Datei zu lesen, belegt dies Speicher in PHP. Wenn Sie beispielsweise versuchen, eine MP3-Datei zu öffnen und zu lesen (z. B. $ data = file (" http://mydomain.com/path/sample.mp3 "), wird alles in den Speicher gezogen .

Wie Nelson vorschlägt, können Sie daran arbeiten, Ihr maximales Speicherlimit zu erhöhen, wenn Sie tatsächlich so viel Speicher benötigen.

Beau Simensen
quelle
2

Wir hatten eine ähnliche Situation und haben versucht, oben in den Antworten ini_set ('memory_limit', '-1') angegeben; und alles funktionierte gut, komprimierte Bilddateien größer als 1 MB in KBs.

dynamischer Fluss
quelle
1

Schreiben

ini_set('memory_limit', '-1');

in deiner index.php oben nach dem öffnen des php tag

Prafull
quelle
1

Ich habe dieselbe Fehlermeldung erhalten, nachdem ich in Wordpress zu einem neuen Thema gewechselt habe. PHP lief Version 5.3, also wechselte ich zu 7.2. Das hat das Problem behoben.

DavGarcia
quelle
1

Wenn Sie ein Shared Hosting verwenden, können Sie das Inkrement der PHP-Größenbeschränkung nicht erzwingen.

Gehen Sie einfach zu Ihrem cpanel und aktualisieren Sie Ihre PHP-Version auf 7.1 und höher, dann können Sie loslegen.

Erfolgstar
quelle
0

WordPress-Benutzer fügen Zeile hinzu:

@ini_set('memory_limit', '-1');

in wp-settings.php finden Sie im im WordPress installierten Stammordner

Praveesh P.
quelle
0

Ich hatte mein Hosting nicht erneuert und die Datenbank war schreibgeschützt. Joomla musste die Sitzung schreiben und konnte es nicht tun.

Alberto M.
quelle
0

Ich hatte das gleiche Problem, das PHP in der Kommandozeile laufen ließ. Vor kurzem hatte ich Änderungen an der Datei php.ini und habe einen Fehler beim Ändern der Datei php.ini gemacht

Dies ist für PHP7.0

Pfad zu php.ini, wo ich Fehler gemacht habe: /etc/php/7.0/cli/php.ini

Ich hatte gesetzt memory_limit = 256(was bedeutet 256 bytes)
statt memory_limit = 256M(was bedeutet 256 Mega bytes).

;; Maximale Speichermenge, die ein Skript belegen darf (128 MB)
; http://php.net/memory-limit
memory_limit = 128M

Nachdem ich es korrigiert hatte, lief mein Prozess einwandfrei.

theBuzzyCoder
quelle
0

Führen Sie diesen Befehl in Ihrem Magento-Stammverzeichnis aus php -d memory_limit=4G bin/magento

Mohammed Muzammil
quelle
-1

Wenn Sie Laravel verwenden, verwenden Sie diese Methoden

public function getClientsListApi(Request $request){ print_r($request->all()); //for all request print_r($request->name); //for all name }

anstatt

public function getClientsListApi(Request $request){ print_r($request); // it show error as above mention }

Ajay
quelle