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

StackOverflow https://stackoverflow.com/questions/415801

Domanda

Questo messaggio di errore è stato presentato, qualche suggerimento?

  

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

È stato utile?

Soluzione

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 bene.

Grazie per dare suggerimenti agli amici.

Altri suggerimenti

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

  1. Se hai accesso al tuo file PHP.ini, modifica la riga in PHP.ini Se la tua linea mostra 32M prova 64M: memory_limit = 64M; Quantità massima di memoria che uno script può consumare (64 MB)

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

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 che hai finito impostandoli su null. per esempio. $ OldVar = null;

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

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 la migliore pratica.

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

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. Tuttavia, gestire l'intero set di dati in 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 una o più volte con foreach () . È molto più efficiente in termini di memoria utilizzare un ciclo while () per recuperare ed elaborare una riga alla volta. Lo stesso vale per l'elaborazione di un file.

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 bit per bit usando fopen & amp; fread .

Ho riscontrato lo stesso problema in php7.2 con laravel 5.6. Ho appena aumentato la quantità di variabile memory_limit = 128M in php.ini come richiesto dalle mie applicazioni. Potrebbe essere 256 M / 512 M / 1048 M ..... Ora funziona bene.

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 alloca anche le variabili indesiderate nello script.

Controlla questa libreria php: Liberare memoria con PHP

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ì troverai WP_MEMORY_LIMIT e 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');

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 compresse superiori a 1 MB a KB.

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 ") riporterà tutto in memoria.

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

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

Scrivi

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

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

riga di aggiunta utenti wordpress:

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

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

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

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.

Noto che molte risposte provano solo ad aumentare la quantità di memoria data a uno script che ha il suo posto, ma il più delle volte significa che qualcosa è troppo liberale con la memoria a causa di una quantità non voluta 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 ??notato che ini_set ('memory_limit', '-1'); (nessun limite) può causare instabilità del server come 0 bytes = cattive cose . Invece, trova un equilibrio ragionevole tra ciò che il tuo 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 xdebug è utile, ma si riduce a 3 passaggi:

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

Ho avuto lo stesso problema con php 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 byte )
invece di memory_limit = 256M (che significa 256 Mega byte ).

  

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

Dopo averlo corretto, il mio processo ha iniziato a funzionare correttamente.

Il passaggio dal server a php 7.x ha risolto il problema nel mio caso

se stai usando laravel allora utilizzare in questo modo

funzione pubblica getClientsListApi (Request $ request) {       print_r ($ request- > tutti ()); // per tutte le richieste       print_r ($ request- > nome); // per tutto il nome }

anziché

funzione pubblica getClientsListApi (Request $ request) {       print_r ($ richiesta); // mostra l'errore come sopra menzionato }

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top