2010-12-09 60 views
16

estoy recibiendo el error cuando ejecuto mi script PHP ....límite de memoria superior para PHP/Apache

Fatal error: Out of memory (allocated 1827405824) (tried to allocate 88800 bytes) 

He añadido esta línea para mi script PHP ..

ini_set("memory_limit","3000M"); 

Esta afirmación parece controlar correctamente el uso de la memoria, pero parece que no puedo obtenerla por encima de 1,8 GB. Es como si el límite de memoria superior estuviera restringido en otro lugar. También he añadido a la php.ini ...

memory_limit = 3000M 

¿Alguien sabe si la memoria está restringido en otros lugares?

Estoy ejecutando un servidor local con Xampp. Tengo Windows 7, 64 bits con 4 GB de RAM. Mi script usa la biblioteca de imágenes GD de PHP y me sale el error cuando trato de asignar una referencia de imagen con ImageCreateTrueColor().

(sé que esto es una enorme cantidad de memoria -. Pero esto es sólo un uno-de guión, y es sólo mucho más fácil de hacerlo de esta manera)

Gracias.

actualización ....

@Orbling @elusive espero que todo el mundo se aburre un poco con esta pregunta, pero aquí está el código simplificado que ilustra el problema.

<?php 
    ini_set("memory_limit","4000000000"); 
    echo "ini_get = " . ini_get('memory_limit') . "<br>\n"; 
    echo "memory_get_usage = " . memory_get_usage(true) . "<br>\n"; 
    $bigImageHandle = imagecreatetruecolor(22200, 24800); //this is line 5 
?> 

salida navegador ...

ini_get = 4000000000 
memory_get_usage = 524288 

Fatal error: Out of memory (allocated 1843396608) (tried to allocate 88800 bytes) in 
E:\User\My_Webs\experiments\houseshunting\temp\osMaps\t1.php on line 5 

He probado esto con un conjunto más pequeño de los azulejos y la memoria utilizada por imagecreatetruecolor() y estimo que necesito 2.7GB

+0

¿Seguro de que necesita una gran cantidad de datos ** tales, al mismo tiempo **? ¿Estás componiendo una imagen de miles de otras imágenes? – jwueller

+0

Estoy de acuerdo con escurridizo. Es casi seguro que estás haciendo algo mal por necesitar tanta memoria. – DampeS8N

+0

Estoy haciendo una imagen grande de muchas imágenes pequeñas. Para hacer esto, necesito asignar una referencia de imagen grande, que está causando el problema. ¿O está sugiriendo que hay una manera de combinar muchas imágenes juntas que no requieren una gran cantidad de memoria? – spiderplant0

Respuesta

0

Qué PHP versión que estás usando?

La variable memory_limit está, o estaba, contenida en un entero de 32 bits, por lo que no puede superar los 2 GB.

Ver: http://bugs.php.net/bug.php?id=39132&edit=1

Desde la parte inferior comentario sobre ese informe de error, podría ser la rutina que traduce el formato legible por humanos a un número, trate de poner en cifras.

+0

PHP 5.31 Probé dígitos solamente pero no tuvo ningún efecto. – spiderplant0

+0

Supongo que tiene la memoria disponible? ¿Has intentado configurarlo en php.ini? – Orbling

+0

Sí, lo probé en ambos lugares. Tengo 4GB de RAM física. Según el administrador de tareas, el 44% está en uso antes de ejecutar el script (aunque es difícil decirlo con Windows superfetch). Aunque pensé que solo usaría el caché del archivo de paginación si se acababa de todos modos. – spiderplant0

1

probar este

set_time_limit(300); 
ini_set('memory_limit', '20000M'); 
+1

la memoria del servidor es 4G ... – ajreal

+0

Vahan Margaryan, intentado - obtenga el mismo resultado. – spiderplant0

+1

¿Notó que está sugiriendo 20 conciertos ¿Cómo se supone que esto funcione? – jwueller

0

Prueba esto:

#php_value memory_limit 300M 
#php_value upload_max_filesize 200M 
#php_value post_max_size 200M 
#php_value max_execution_time 80000 
#php_value max_input_time 80000 
+0

¿Dónde pongo estas líneas? La búsqueda en Internet sugiere su .htaccess? No parece tener este archivo en la carpeta xammp? – spiderplant0

+0

remove # put in .htaccess –

+2

@Pradeep Singh: ¿Por qué pones el '#', de todos modos? – jwueller

1

Compruebe su configuración de Apache (por ejemplo, httpd.conf). Es probable que una directiva RLimitMEM que limita la memoria permita a los niños procesar solicitudes de manejo.

Por lo tanto, puede establecer su límite PHP todo lo que desee, si Apache genera el proceso con un límite de memoria, no puede excederlo.

Si está en un servicio alojado y tiene un servidor compartido, es probable que no tenga acceso a esta configuración y necesite trabajar con su proveedor.Como puede ver, su configuración se aplica a todo el servidor ... no es probable que logren que cambien esto. Por otra parte, si está buscando generar procesos de más de 1.5 Gig, probablemente debería solucionar el problema de una manera diferente (otros lo han sugerido) o obtener un servidor dedicado de algún tipo (por ejemplo, EC2).

Por ejemplo:

/usr/local/apache/conf 
#RLimitMEM 85643200 104857600 # Limit to: 80Mb/process, 100Mb total 
RLimitMEM 134217728 537395200 # Limit to: 128Mb/Process, 512Mb total 
7

se está ejecutando en un sistema operativo de 64 bits, pero Apache y PHP es probable siendo de 32 bits. Si está utilizando mod_php, apache sería el factor limitante aquí.

Los procesos de 32 bits tienen un límite de 2GiB de RAM a menos que haya utilizado el modificador/3GB y el software tenga en cuenta la compatibilidad con 3 GB.

Eso todavía deja hasta alrededor de 200 MiB que parece no utilizada, pero es lo suficientemente pequeño que puede ser utilizado por varias bibliotecas que todos tienen que ser cargados en la memoria

Por lo que yo sé, el uso de la biblioteca ganaron' t aparece en la memoria comprometida, pero aún cuenta para el límite de 2GiB (muy similar a la memoria del dispositivo para el límite de 4GiB en ventanas de 32 bits.) La instalación de 2 tarjetas gráficas GiB te lleva a menos de 2GiB de RAM utilizable.

¿La solución más probable? Instale un PHP de 64 bits y luego envíelo a eso (usando una llamada al sistema(), quizás)

0

Es probable que el problema se deba a la ejecución de apache y php de 32 bits. Intente actualizar estos a binarios de 64 bits y vea si eso soluciona el problema.

5

Usando Acquia Dev Desktop, tuve muchos bloqueos de límite de memoria.

Después de haber aumentado el límite de memoria en PHP.ini.

php_value memory_limit     1024M 
php_value max_execution_time   3000 

Este problema fue menos frecuente pero aún ocurriendo (Especialmente con Feature Recrear)

En mi httpd.conf he aumentado la StackThread a 16M

ThreadStackSize 16*1024*1024 

Y resolvió el problema de la memoria accidente . esperan que los pueda ayudar

+0

Parece que resuelve mi problema (Win7, 64bit, xampp) para este mensaje de error: VirtualAlloc() falló: [...] VirtualFree() error: [...] [...]] Error grave de PHP: Sin memoria (asignado 98566144) (intentó asignar 16384 bytes) en [...] – Sven

-2

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

Cuestiones relacionadas