php memory-leaks imagick

Fugas de memoria de PHP Imagick



memory-leaks (3)

Tengo que renderizar algo con Imagick en PHP CLI. Me he dado cuenta de que cada 3-5 días la memoria del servidor se llena, por lo que no puedo connet a través de ssh o ftp.

con memory_get_usage () quité la fuga de memoria a la parte imagick del script. el script se ve así:

$sourceImg = ''source.png''; $destImg = ''dest.png''; $background =''#00ff00''; $im = new Imagick(); $im->pingImage($sourceImg); $im->readImage($sourceImg); $draw = new ImagickDraw(); for($i=1;$i<=5;$i++){ $draw->setFillColor( $background); $draw->rectangle( 10*$i+5, 10, 10*$i+10, 20); } $im->drawImage( $draw ); $im->writeImage( $destImg ); $im->destroy(); unset($im,$draw);

Destruyo la referencia de imagen y desarmo el objeto imagick e imagickDraw, pero el script no liberará memoria. El método setFillColor () toma la mayor cantidad de memoria

¿Puedo hacer algo más para liberar el espacio utilizado por imageick?

imagen del consumo de memoria


Sé que esto es viejo, pero me encontré con el mismo problema y al llamar $im->clear() lugar de $im->destroy() arregló la fuga de memoria para mí.

De acuerdo con la documentación Imagick::destroy() has been deprecated in favor of Imagick::clear() . Así que clear() debería ser usado.


imagick usa una biblioteca compartida y su uso de memoria está fuera del alcance de PHP, por lo que ajustar la memoria PHP y la recolección de basura no será de ayuda.

Tuve el mismo problema, tratando de manejar una imagen de tiff de varias páginas con 50 (!) Páginas de 3000x2000 píxeles. La solución es tener imagick poner su memoria caché de píxeles en el disco.

Agregar esto antes de crear el objeto Imagick solucionó el problema:

// pixel cache max size IMagick::setResourceLimit(imagick::RESOURCETYPE_MEMORY, 256); // maximum amount of memory map to allocate for the pixel cache IMagick::setResourceLimit(imagick::RESOURCETYPE_MAP, 256);

El objetivo es hacer que imagick ponga su memoria caché de píxeles en el disco en lugar de en la memoria RAM. El lugar predeterminado parece ser files / tmp / magick-XXnnnnn, así que asegúrese de que / tmp no esté en shmfs / ramdisk, o cambie el directorio temporal que usa imagick.

Otros límites de recursos para investigar: imagick::RESOURCETYPE_DISK , imagick::RESOURCETYPE_FILE , e imagick::RESOURCETYPE_AREA . Se describen en la página del manual imagick :: getResourceLimit () (no tan bien en la página para setResourceLimit() ).

En mi bucle de manejo de imágenes, tengo set_time_limit(300) , ya que el script tarda años en procesar esta enorme imagen (cuando descomprime).

EDITAR: en versiones recientes, setResourceLimit() no debería llamarse como un método estático, sino en el objeto real, como:

$im->setResourceLimit(imagick::RESOURCETYPE_MEMORY, 256); $im->setResourceLimit(imagick::RESOURCETYPE_MAP, 256); $im->setResourceLimit(imagick::RESOURCETYPE_AREA, 1512); $im->setResourceLimit(imagick::RESOURCETYPE_FILE, 768); $im->setResourceLimit(imagick::RESOURCETYPE_DISK, -1);


xdebug no pudo ayudarme ... así que decidí buscar otra solución. se me ocurrió usar image magic direct:

$sourceImg = ''source.png''; $destImg = ''dest.png''; $background =''#00ff00''; $command = "convert {$sourceImg}"; $out = array(); for($i=1;$i<=5;$i++){ $command .= " -fill /"{$background}/" "; $command .= " -draw ''rectangle {$x1},{$y1} {$x2},{$y2}''"; } $command .= " {$destImg}"; exec($command,$out);

esta solución funciona de manera más fluida que imagick one. pero no me gusta el código propenso a errores.