2010-05-13 12 views
9

Estoy tratando de procesar un directorio de imágenes JPEG (aproximadamente 600+, que van desde 50k a 500k) usando PHP: GD para cambiar el tamaño y guardar las imágenes pero he golpeado un poco enganchar bastante temprano en el proceso. Después de procesar correctamente solo 3 imágenes (30K, 18K y 231K) obtengo un Tamaño de memoria permitido de 16777216 bytes agotados PHP Error grave.PHP GD Tamaño de memoria permitido agotado

estoy ciclismo a través de las imágenes y pidiendo el código de abajo:

list($w, $h) = getimagesize($src); 

    if ($w > $it->width) { 
     $newwidth = $it->width; 
     $newheight = round(($newwidth * $h)/$w); 
    } elseif ($w > $it->height) { 
     $newheight = $it->height; 
     $newwidth = round(($newheight * $w)/$h); 
    } else { 
     $newwidth = $w; 
     $newheight = $h; 
    } 

    // create resize image 
    $img = imagecreatetruecolor($newwidth, $newheight); 
    $org = imagecreatefromjpeg($src); 

    // Resize 
    imagecopyresized($img, $org, 0, 0, 0, 0, $newwidth, $newheight, $w, $h); 
    imagedestroy($org); 

    imagejpeg($img, $dest); 

    // Free up memory 
    imagedestroy($img); 

He tratado de liberar memoria con la función imagedestroy pero no parecen tener ningún efecto. La secuencia de comandos se mantiene asfixia constantemente en la línea de código imagecreatefromjpeg.

Comprobé el php.ini y la configuración memory_limit = 16M parece que se mantiene correctamente. Pero no puedo entender por qué la memoria se está llenando. ¿No debería estar liberando la memoria al recolector de basura? Realmente no quiero aumentar la configuración memory_limit. Esto parece una mala solución que podría conducir a más problemas en el futuro.

FYI: Estoy ejecutando mi script desde el símbolo del sistema. No debería afectar la funcionalidad, pero podría influir en su respuesta, así que pensé que debería mencionarlo.

¿Alguien puede ver si me falta algo simple o si hay un error de diseño aquí? Pensarías que esta sería una tarea bastante sencilla. Sin duda, esto tiene que ser posible, ¿verdad?

Respuesta

15
ini_set('memory_limit', '64M'); 

problema resuelto

+0

Haré esto una prueba. Creo que saldrá el error más adelante en el proceso. Espero estar equivocado – gurun8

+0

Estaba equivocado. Esto funcionó. Gracias. – gurun8

+5

Supongo que debería haber publicado qué hacer en lugar de por qué hacerlo. – JYelton

12

Es posible que una o más de sus imágenes realmente se inflen a 16M en la memoria bruta. Una forma de verificarlo es abrirlo en Photoshop o Irfanview y verificar el espacio de color y las dimensiones en píxeles.

No hace falta mucho para llegar a los 16M, por ejemplo, considere una cámara "modesta" de 6 megapíxeles. Crea una imagen de 3072 píxeles por 2048 píxeles. En un byte por color (RGB) el tamaño prima es:

3072 x 2048 x 3 = 18.874.368

Por lo tanto, es posible que desee aumentar la memoria de acuerdo con las imágenes más grandes que se pueden esperar para procesar . Pero debes considerar su tamaño bruto.

+0

Lo comprobaré. Gracias. – gurun8

+3

Y gd no solo almacena tres sino cuatro bytes por pixel ~ 25M – VolkerK

+0

Supongo que es un canal alfa? Buen punto, VolkerK. – JYelton

0

Simplemente use ini_set(); y establecer el memory_limit a cualquier tamaño que desee.

1

En algunos casos, simplemente no puede anticipar la mayor asignación de memoria que necesitarán las imágenes que va a procesar. Para evitar un accidente, puede incluir los siguientes comandos antes y después de su bucle:

register_shutdown_function ('my_function'); 
$mem_limit = ini_get ('memory_limit'); 
ini_set ('display_errors', false); 
ini_set ('memory_limit', '400M');   // some high value 

(... su proceso ...)

ini_set ('memory_limit',$mem_limit); 

y lugar dentro de la función "mi_funcion()" el código que manejará el bloqueo.

Cuestiones relacionadas