Tamaño de memoria permitido de 33554432 bytes agotados (intentó asignar 43148176 bytes) en php

279

Este mensaje de error se presenta, ¿alguna sugerencia?

Tamaño de memoria permitido de 33554432 bytes agotados (intentó asignar 43148176 bytes) en php

panidarapu
fuente
55
Aumente su límite máximo de memoria a 64 MB en su archivo php.ini. Búsqueda en Google ¿ Pero podría preguntar por qué está tratando de asignar tanta memoria? ¿En qué línea de código falla?
1
¿Qué hace el script cuando falla? puedes publicar el código?
Neil Aitken
3
Parece un archivo txt muy grande.
macbirdie
10
Convencionalmente, lee archivos de un tamaño potencialmente grande o arbitrario de una línea a la vez, sobrescribiendo la memoria de la línea anterior con cada línea leída. O puede que solo desee seguir o encabezar el archivo para obtener las últimas entradas. Aumentar su asignación de memoria a medida que crece el archivo no es la respuesta.
ekerner

Respuestas:

319

Por fin encontré la respuesta:

Solo agregue esto debajo de la línea anterior a la línea en la que obtiene un error en su archivo

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

Tomará un uso ilimitado de la memoria del servidor, está funcionando bien.

Gracias por dar sugerencias amigos.

panidarapu
fuente
125
Aún debe verificar por qué la memoria está agotada. Tal vez no necesite leer todo el archivo, tal vez leerlo secuencialmente.
macbirdie
8
- @panidarapu y @Don Jones: dependiendo de la cantidad de memoria y de cómo se use este script, podría ser peligroso permitir el cambio en el uso de la memoria de esta manera. Don, en su caso, es probable que pueda dividir la alimentación en trozos más pequeños y analizar lo que necesita. Me alegro de que funcione, pero ten cuidado.
cobarde anónimo
55
Esta sugerencia funcionó para mí. El límite de memoria que aumenta dinámicamente en el script se realiza mediante la función ini_set (): ini_set ('memory_limit', '128M');
mente
37
Chicos, por favor no busquen esta solución rápida. Puede lastimarte a largo plazo. Como buen programador, debe descubrir la razón detrás de este consumo de memoria y aumentarlo según sea necesario en lugar de mantenerlo UNLIMITED.
Sumoanand
113
Wow, esta respuesta masivamente votada me parece una muy mala práctica. -1!
Ambidex
59

Aquí hay dos métodos simples para aumentar el límite de alojamiento compartido:

  1. Si tiene acceso a su archivo PHP.ini, cambie la línea en PHP.ini Si su línea muestra 32M intente 64M: memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)

  2. Si no tiene acceso a PHP.ini intente agregar esto a un archivo .htaccess: php_value memory_limit 64M

Haider Abbas
fuente
47

Tu script está usando demasiada memoria. Esto a menudo puede suceder en PHP si tiene un bucle que se ha quedado sin control y está creando objetos o agregándolos a matrices en cada pasada del bucle.

Verifica los bucles infinitos.

Si ese no es el problema, intente ayudar a PHP destruyendo objetos con los que haya terminado configurándolos como nulos. p.ej.$OldVar = null;

Verifique también el código donde ocurre el error. ¿Esperarías que esa línea asigne una gran cantidad de memoria? Si no, intente averiguar qué salió mal ...

Rik Heywood
fuente
3
Tuve este problema exacto, resultó que había creado una función recursiva inadvertidamente, por lo que se quedó sin memoria en cualquier momento aleatorio durante la ejecución del código. Esto tuvo la ventaja de que ahora tengo el código de memoria más eficiente del mundo, creado en la búsqueda de una pérdida de memoria.
Kris Selbekk
1
Por el bien de otros que perseguirán a un conejo por un hoyo. Doctrine en Symfony creo que tiene un problema con el monólogo y cuando hay una excepción PDO creará un bucle infinito de excepciones, ya que intentará una excepción para la excepción, ocultando así el problema real (un archivo db dañado en mi caso).
Desislav Kamenov
39

Haciendo :

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

nunca es bueno Si desea leer un archivo muy grande, se recomienda copiarlo poco a poco. Pruebe el siguiente código para las mejores prácticas.

$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
fuente
66
No puedo creer que todas estas personas recomienden establecer memory_limit en -1 ... Locura en un servidor de producción. Gracias por una solución mucho más limpia.
JohnWolf
2
Mientras está en la "mejor práctica", es bueno cerrar el controlador de archivos después del whileciclo:fclose($file)
kodeart
2
@assetCorp ¿Cómo ayuda esto, siempre que el archivo tenga, por ejemplo, 100MiB y el límite de memoria PHP todavía esté configurado en 32 MiB? Lo lees con fragmentos seguros de 1MiB, pero luego lo agregas a una variable que usará toda la memoria disponible una vez que el ciclo llegue a 31. iteración. ¿Cómo es mejor? Solo la salida de los fragmentos de manera similar para no requerir el almacenamiento de todos en una variable ayudaría a resolver el problema.
helvete
17

Desafortunadamente, es fácil programar en PHP de una manera que consume memoria más rápido de lo que crees. Copiar cadenas, matrices y objetos en lugar de usar referencias lo hará, aunque se supone que PHP 5 lo hace de manera más automática que en PHP 4. Pero lidiar con su conjunto de datos en varios pasos también es un desperdicio en comparación con el procesamiento de la unidad lógica más pequeña a la vez El ejemplo clásico es trabajar con grandes conjuntos de resultados de una base de datos: la mayoría de los programadores obtienen todo el conjunto de resultados en una matriz y luego lo repiten una o más veces foreach(). Es mucho más eficiente en la memoria usar un while()bucle para buscar y procesar una fila a la vez. Lo mismo se aplica al procesamiento de un archivo.

staticsan
fuente
Parece bastante probable que esto sea lo que hace.
Kzqai
13

Si desea leer archivos grandes, debe leerlos poco a poco en lugar de leerlos de una vez.
Es matemática simple: si lee un archivo grande de 1 MB a la vez, se necesita al menos 1 MB de memoria al mismo tiempo para almacenar los datos.

Entonces deberías leerlos poco a poco usando fopen& fread.

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

Me he enfrentado al mismo problema en php7.2 con laravel 5.6. Solo aumento la cantidad de variable memory_limit = 128Men php.ini según lo exijan mis aplicaciones. Puede ser 256M / 512M / 1048M ..... Ahora funciona bien.

Ziaur Rahman
fuente
6

También estaba teniendo el mismo problema, busqué archivos phpinfo.ini, php.ini o .htaccess en vano. Finalmente, miré algunos archivos php, los abrí y verifiqué la memoria de los códigos internos. Finalmente, esta solución fue con lo que salí y funcionó para mí. Estaba usando wordpress, por lo que esta solución solo podría funcionar para el problema de límite de tamaño de memoria de wordpress. Mi solución, abra el archivo default-constants.php en la carpeta / public_html / wp-includes . Abra ese archivo con el editor de código y busque la configuración de memoria bajo el wp_initial_constantsalcance, o simplemente presione Ctrl + F para encontrar la palabra "memoria". Allí vendrás WP_MEMORY_LIMITy WP_MAX_MEMORY_LIMIT. Simplemente increméntelo, en mi caso era de 64 MB, lo aumenté a 128 MB y luego 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' );
    }
}

Por cierto, no hagas el siguiente código, porque es una mala práctica:

ini_set('memory_limit', '-1');
garakchy
fuente
1
Funciona para sitios web de WordPress, donde el acceso no está disponible para archivos .htaccess y php.ini. +1
Mustafa sabir
Yo diría que cambiar esos límites en un archivo 'básico' de WordPress no es realmente una buena idea; en su wp-config.phplugar, puede agregar esos límites muy fácilmente , donde no se sobrescribirán con futuras actualizaciones de WordPress. Además, algunos complementos de seguridad (como WordFence, por ejemplo) se quejarán si se cambian los archivos 'básicos' de WordPress ...
Gwyneth Llewelyn
1
@GwynethLlewelyn No sé cómo hacerlo, ¿puedes explicarlo, por favor?
Garakchy
1
Oh ... solo edite wp-config.phpy agregue las dos líneas allí (es decir, define( 'WP_MEMORY_LIMIT', '200M' );y define( 'WP_MAX_MEMORY_LIMIT', '256M' );. A diferencia de los archivos en el 'núcleo' WP (es decir, todo lo que está debajo wp-includes), que se sobrescribirá con las actualizaciones de WP, wp-config.phpno lo hará, está allí exactamente para ¡El propósito exacto de anular las constantes de WP!
Gwyneth Llewelyn
1
La "mala práctica" es situacional. -1está bien para procesos de ejecución corta. Por ejemplo, un contenedor de creador de php que se utiliza para ejecutar pruebas unitarias o instalaciones de compositor / etc. Simplemente no ejecute su sitio de producción con el conjunto así.
Emmdee
5

Puede aumentar la memoria permitida para el script php ejecutando la siguiente línea sobre todos los códigos en el script:

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

Y también desasignar las variables no deseadas en el script.

Revisa esta biblioteca php: Liberando memoria con PHP

Sanjay Kumar NS
fuente
4
ini_set('memory_limit', '-1');
Định Nguyễn Thế
fuente
3
@Pang ini_set ('memory_limit', '-1');
CRIMINAL DIGITAL
3

Noto que muchas respuestas solo intentan aumentar la cantidad de memoria dada a un script que tiene su lugar, pero la mayoría de las veces significa que algo está siendo demasiado liberal con la memoria debido a una cantidad de volumen o tamaño imprevisto. Obviamente, si no eres el autor de un script, estás a merced del autor a menos que te sientas ambicioso :) Los documentos de PHP incluso dicen que los problemas de memoria se deben a " scripts mal escritos "

Cabe mencionar que ini_set('memory_limit', '-1');(sin límite) puede causar inestabilidad del servidor como 0 bytes free = bad things. En cambio, encuentre un equilibrio razonable entre lo que su script está tratando de hacer y la cantidad de memoria disponible en una máquina.

Un mejor enfoque: si usted es el autor del script (o ambicioso), puede depurar tales problemas de memoria con xdebug . La última versión (2.6.0 - lanzada el 29-01-2018) recuperó el perfil de memoria que muestra qué llamadas a funciones consumen grandes cantidades de memoria. Expone problemas en el script que de otro modo serían difíciles de encontrar. Por lo general, las ineficiencias están en un bucle que no espera el volumen que está recibiendo, pero cada caso se dejará como un ejercicio para el lector :)

La documentación de xdebug es útil, pero se reduce a 3 pasos:

  1. Instalarlo : disponible a través de apt-gety yumetc.
  2. Configurarlo - xdebug.ini: xdebug.profiler_enable = 1,xdebug.profiler_output_dir = /where/ever/
  3. Ver los perfiles en una herramienta como QCacheGrind , KCacheGrind
SeanDowney
fuente
2

Si está intentando leer un archivo, eso ocupará memoria en PHP. Por ejemplo, si está intentando abrir y leer un archivo MP3 (como, por ejemplo, $ data = file (" http://mydomain.com/path/sample.mp3 ") lo va a guardar todo en la memoria .

Como sugiere Nelson, puede trabajar para aumentar su límite máximo de memoria si realmente necesita usar tanta memoria.

Beau Simensen
fuente
2

Tuvimos una situación similar y probamos en la parte superior de las respuestas ini_set ('memory_limit', '-1'); y todo funcionó bien, archivos de imágenes comprimidas de más de 1 MB a KB.

flujo dinámico
fuente
1

Escribir

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

en su index.php en la parte superior después de abrir la etiqueta php

Prafull
fuente
1

Estaba recibiendo el mismo mensaje de error después de cambiar a un nuevo tema en Wordpress. PHP estaba ejecutando la versión 5.3, así que cambié a 7.2. Eso solucionó el problema.

DavGarcia
fuente
1

Si está utilizando un alojamiento compartido, no podrá imponer el incremento en el límite de tamaño de php.

Simplemente vaya a su cpanel y actualice su versión de php a 7.1 y superior, entonces estará listo.

successtar
fuente
0

los usuarios de wordpress agregan línea:

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

en wp-settings.php que puedes encontrar en la carpeta raíz instalada de WordPress

Praveesh P
fuente
0

No había renovado mi alojamiento y la base de datos era de solo lectura. Joomla necesitaba escribir la sesión y no pudo hacerlo.

Alberto M
fuente
0

Tuve el mismo problema que ejecutar php en la línea de comandos. Recientemente, tuve cambios en el archivo php.ini e hice un error al cambiar php.ini

Esto es para php7.0

camino a php.ini donde cometí un error: /etc/php/7.0/cli/php.ini

Había establecido memory_limit = 256(lo que significa 256 bytes) en
lugar de memory_limit = 256M(lo que significa 256 Mega bytes).

; Cantidad máxima de memoria que un script puede consumir (128 MB)
; http://php.net/memory-limit
memory_limit = 128M

Una vez que lo corregí, mi proceso comenzó a funcionar bien.

theBuzzyCoder
fuente
0

Ejecute este comando en su directorio raíz de Magento php -d memory_limit=4G bin/magento

Mohammed Muzammil
fuente
-1

si está usando laravel, use estas formas

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

en vez de

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

Ajay
fuente