Dimensione della memoria consentita di 33554432 byte esauriti (tentato di allocare 43148176 byte) in php


279

Questo messaggio di errore è stato presentato, qualche suggerimento?

Dimensione della memoria consentita di 33554432 byte esauriti (tentato di allocare 43148176 byte) in php


5
Aumenta il limite massimo di memoria a 64 MB nel file php.ini. Ricerca su Google Ma potrei chiederti perché stai cercando di allocare tanta memoria? In quale riga di codice fallisce?

1
Cosa sta facendo lo script quando fallisce? puoi pubblicare il codice?
Neil Aitken,

3
Sembra un file txt molto grande.
macbirdie,

10
Convenzionalmente, leggi file di dimensioni potenzialmente grandi o arbitrarie una riga alla volta, sovrascrivendo la memoria della riga precedente con ogni riga letta. Oppure potresti semplicemente voler mettere in coda o dirigere il file per ottenere le ultime voci. Aumentare l'allocazione di memoria man mano che il file cresce non è la risposta.
ekerner,

1
Possibile duplicato di errore
irreversibile

Risposte:


319

Alla fine ho trovato la risposta:

Basta aggiungere questo sotto la riga prima della riga di errore nel file

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

Ci vorrà un utilizzo illimitato della memoria del server, funziona benissimo.

Grazie per aver suggerito amici.


125
Dovresti comunque controllare perché la memoria è esaurita. Forse non è necessario leggere l'intero file, magari leggerlo in sequenza.
macbirdie,

8
- @panidarapu e @Don Jones: a seconda della quantità di memoria e di come viene utilizzato questo script, potrebbe essere pericoloso consentire in questo modo di modificare l'utilizzo della memoria. Don, nel tuo caso, puoi probabilmente suddividere il feed in piccoli pezzi e analizzare ciò di cui hai bisogno. Sono contento che funzioni, ma fai attenzione.
codardo anonimo l'

5
Questo suggerimento ha funzionato per me. L'aumento dinamico del limite di memoria nello script avviene tramite la funzione ini_set (): ini_set ('memory_limit', '128M');
mente,

37
Ragazzi, per favore non andare per questa soluzione rapida. Può farti del male a lungo termine. Come buon programmatore, dovresti capire il motivo di questo consumo di memoria e aumentare come richiesto invece di tenerlo UNLIMITED.
Sumoan e l'

113
Caspita, questa risposta massicciamente votata mi sembra una cattiva pratica. -1!
Ambidex,

59

Ecco due semplici metodi per aumentare il limite di hosting condiviso:

  1. Se hai accesso al tuo file PHP.ini, cambia la linea in PHP.ini Se la tua linea mostra 32M prova 64M: memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)

  2. Se non hai accesso a PHP.ini prova ad aggiungere questo a un file .htaccess: php_value memory_limit 64M


47

Lo script utilizza troppa memoria. Questo può accadere spesso in PHP se hai un loop che è fuori controllo e stai creando oggetti o aggiungendo array ad ogni passaggio del loop.

Verifica la presenza di loop infiniti.

Se questo non è il problema, prova ad aiutare PHP distruggendo gli oggetti con cui hai finito impostandoli su null. per esempio.$OldVar = null;

Controlla anche il codice in cui si verifica l'errore. Ti aspetteresti che quella linea stia allocando una grande quantità di memoria? In caso contrario, prova a capire cosa è andato storto ...


3
Ho avuto questo esatto problema - ho scoperto che avevo inavvertitamente creato una funzione ricorsiva - e quindi ha esaurito la memoria in qualsiasi momento casuale durante l'esecuzione del codice. Ciò ha avuto il vantaggio di avere ora il codice con la memoria più efficiente al mondo, creato nella caccia di una perdita di memoria.
Kris Selbekk,

1
Per il bene di altri che inseguiranno un coniglio in una buca. La dottrina in Symfony penso che abbia un problema con monolog e quando c'è un'eccezione DOP creerà un ciclo infinito di eccezioni poiché proverà un'eccezione per l'eccezione nascondendo così il vero problema (un file db corrotto nel mio caso).
Desislav Kamenov,

39

Fare:

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

non è mai buono. Se si desidera leggere un file molto grande, è consigliabile copiarlo bit per bit. Prova il seguente codice per le migliori pratiche.

$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;

6
Non riesco a credere a tutte queste persone che raccomandano di impostare memory_limit su -1 ... Cosa folle da fare su un server di produzione. Grazie per una soluzione molto più pulita.
John Wolf,

2
In "best practice", è bene chiudere il gestore dei file dopo il whileciclo:fclose($file)
kodeart

2
@assetCorp Come può essere d'aiuto, purché il file abbia ad esempio 100MiB e il limite di memoria PHP sia ancora impostato su 32 MiB. Lo leggi da blocchi sicuri di 1 MiB, ma poi lo aggiungi in una variabile che utilizzerà tutta la memoria disponibile una volta che il ciclo raggiunge 31. iterazione. Come va meglio? Solo l'output dei blocchi in modo simile per non richiedere la memorizzazione di tutti in una variabile aiuterebbe a risolvere il problema.
Helvete

17

Sfortunatamente è facile programmare in PHP in un modo che consuma memoria più velocemente di quanto pensiate. Copiare stringhe, array e oggetti invece di usare i riferimenti lo farà, anche se PHP 5 dovrebbe farlo in modo più automatico rispetto a PHP 4. Ma gestire l'intero set di dati su più passaggi è anche dispendioso rispetto all'elaborazione dell'unità logica più piccola Al tempo. L'esempio classico sta lavorando con set di risultati di grandi dimensioni da un database: la maggior parte dei programmatori recupera l'intero gruppo di risultati in un array e quindi lo esegue il ciclo uno o più volte con foreach(). È molto più efficiente della memoria utilizzare un while()loop per recuperare ed elaborare una riga alla volta. Lo stesso vale per l'elaborazione di un file.


Sembra abbastanza probabile che questo sia ciò che fa.
Kzqai,

13

Se vuoi leggere file di grandi dimensioni, dovresti leggerli bit per bit invece di leggerli contemporaneamente.
È semplice matematica: se leggi un file di grandi dimensioni da 1 MB alla volta, sono necessari almeno 1 MB di memoria contemporaneamente per conservare i dati.

Quindi dovresti leggerli poco a poco usando fopen& fread.


1
Risolto usando:$fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
Kai Noack il

12

Ho riscontrato lo stesso problema in php7.2 con laravel 5.6. Ho solo aumentare la quantità di variabili memory_limit = 128Min php.ini come richiedono le mie applicazioni. Potrebbe essere 256 M / 512 M / 1048 M ..... Ora funziona benissimo.


6

Avevo anche lo stesso problema, ho cercato inutilmente i file phpinfo.ini, php.ini o .htaccess. Finalmente ho guardato alcuni file php, li ho aperti e ho controllato i codici all'interno per la memoria. Finalmente questa soluzione è stata quella con cui sono uscito e ha funzionato per me. Stavo usando wordpress, quindi questa soluzione potrebbe funzionare solo per il problema del limite della dimensione della memoria di wordpress. La mia soluzione, apri il file default-constants.php nella cartella / public_html / wp-Includes . Apri quel file con l'editor di codice e trova le impostazioni di memoria nell'ambito wp_initial_constants, o semplicemente Ctrl + F per trovare la parola "memoria". Lì verrai WP_MEMORY_LIMITe WP_MAX_MEMORY_LIMIT. Basta aumentarlo, nel mio caso era di 64 MB, l'ho aumentato a 128 MB e poi a 200 MB.

// 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' );
    }
}

A proposito, per favore non fare il seguente codice, perché è una cattiva pratica:

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

1
Funziona con i siti Web wordpress, in cui l'accesso non è disponibile per i file .htaccess e php.ini. +1
Mustafa sabir,

Direi che cambiare quei limiti su un file WordPress 'core' non è davvero una buona idea; puoi così facilmente aggiungere quei limiti wp-config.php, dove non verranno sovrascritti da futuri aggiornamenti di WordPress. Inoltre, alcuni plugin di sicurezza (come WordFence, ad esempio) si lamenteranno se i file 'core' di WordPress vengono modificati ...
Gwyneth Llewelyn,

1
@GwynethLlewelyn Non so come farlo, puoi elaborarlo, per favore?
Garakchy,

1
Oh ... basta modificare wp-config.php. E aggiungere le due linee di là (i .e define( 'WP_MEMORY_LIMIT', '200M' );e define( 'WP_MAX_MEMORY_LIMIT', '256M' );. A differenza dei file sul 'core' WP (vale a dire, tutto sotto wp-includes), che saranno sovrascritti dagli aggiornamenti WP, wp-config.phpnon lo farà - è lì proprio per lo scopo esatto di ignorare le costanti WP!
Gwyneth Llewelyn

1
la "cattiva pratica" è situazionale. -1va bene per i processi di breve durata. Ad esempio un contenitore builder php utilizzato per eseguire unit test o installazioni del compositore / ecc. Basta non gestire il tuo sito di produzione con esso impostato in questo modo.
emmdee,

5

Puoi aumentare la memoria consentita allo script php eseguendo la seguente riga sopra tutti i codici nello script:

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

E anche allocare le variabili indesiderate nello script.

Controlla questa libreria php: liberare memoria con PHP



3

Noto che molte risposte provano solo ad aumentare la quantità di memoria data a una sceneggiatura che ha il suo posto, ma il più delle volte significa che qualcosa è troppo liberale con la memoria a causa di una quantità imprevista di volume o dimensioni. Ovviamente se non sei l'autore di una sceneggiatura sei in balia dell'autore a meno che non ti senta ambizioso :) I documenti di PHP affermano anche che i problemi di memoria sono dovuti a " script scritti male "

Va detto che ini_set('memory_limit', '-1');(nessun limite) può causare instabilità del server come 0 bytes free = bad things. Trova invece un equilibrio ragionevole tra ciò che lo script sta cercando di fare e la quantità di memoria disponibile su una macchina.

Un approccio migliore: se sei l'autore dello script (o ambizioso) puoi eseguire il debug di tali problemi di memoria con xdebug . L'ultima versione (2.6.0 - rilasciata il 29-01-2018) ha riportato alla memoria il profilo che mostra quali chiamate di funzione consumano grandi quantità di memoria. Espone problemi nello script che altrimenti sarebbero difficili da trovare. Di solito, le inefficienze sono in un ciclo che non si aspetta il volume che sta ricevendo, ma ogni caso verrà lasciato come esercizio al lettore :)

La documentazione di xdebug è utile, ma si riduce a 3 passaggi:

  1. Installalo - Disponibile tramite apt-geteyum ecc
  2. Configurarlo - xdebug.ini: xdebug.profiler_enable = 1,xdebug.profiler_output_dir = /where/ever/
  3. Visualizza i profili in uno strumento come QCacheGrind , KCacheGrind

2

Se stai provando a leggere un file, questo occuperà memoria in PHP. Ad esempio, se stai tentando di aprire e leggere un file MP3 (come, ad esempio, $ data = file (" http://mydomain.com/path/sample.mp3 "), verrà tutto nella memoria .

Come suggerisce Nelson, puoi lavorare per aumentare il limite massimo di memoria se devi effettivamente utilizzare tanta memoria.


2

Abbiamo avuto una situazione simile e abbiamo provato dato in cima alle risposte ini_set ('memory_limit', '-1'); e tutto ha funzionato bene, file di immagini compressi superiori a 1 MB a KB.


1

Scrivi

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

nel tuo index.php in alto dopo l'apertura del tag php


1

Stavo ricevendo lo stesso messaggio di errore dopo essere passato a un nuovo tema in Wordpress. PHP stava eseguendo la versione 5.3, quindi sono passato a 7.2. Ciò ha risolto il problema.


1

Se stai utilizzando un hosting condiviso, non sarai in grado di applicare l'incremento nel limite di dimensioni php.

Vai sul tuo pannello e aggiorna la tua versione php alla versione 7.1 e successive, allora sei a posto.


0

gli utenti di wordpress aggiungono una riga:

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

in wp-settings.php che puoi trovare nella cartella principale installata di wordpress


0

Non avevo rinnovato il mio hosting e il database era di sola lettura. Joomla doveva scrivere la sessione e non poteva farlo.


0

Ho avuto lo stesso problema con PHP in esecuzione nella riga di comando. Di recente, ho modificato il file php.ini e ho commesso un errore durante la modifica di php.ini

Questo è per php7.0

percorso a php.ini in cui ho commesso un errore: /etc/php/7.0/cli/php.ini

Avevo impostato memory_limit = 256(che significa 256 bytes)
invece di memory_limit = 256M(che significa 256 Mega bytes).

; Quantità massima di memoria che uno script può consumare (128 MB)
; http://php.net/memory-limit
memory_limit = 128M

Una volta corretto, il mio processo ha iniziato a funzionare correttamente.


0

Esegui questo comando nella directory principale di Magento php -d memory_limit=4G bin/magento


-1

se stai usando laravel, usa questi modi

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

invece di

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.