imagick использует разделяемую библиотеку, и ее использование памяти недоступно для PHP, поэтому настройка памяти PHP и сборки мусора не поможет.
У меня была такая же проблема, я пытался обработать многостраничное изображение с 50 (!) Страницами размером 3000x2000 пикселей.
Решение состоит в том, чтобы imagick поместил свой пиксельный кеш на диск.
Добавление этого до создания объекта Imagick
решило проблему для меня:
// 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);
Цель состоит в том, чтобы imagick поместил свой пиксельный кеш на диск, а не в оперативную память. Кажется, что местом по умолчанию являются файлы / tmp / magick-XXnnnnn, поэтому убедитесь, что / tmp отсутствует в shmfs / ramdisk, или измените временный каталог, используемый imagick.
Другие ограничения для расследования: imagick::RESOURCETYPE_DISK
, imagick::RESOURCETYPE_FILE
и imagick::RESOURCETYPE_AREA
.
Они описаны в справочной странице imagick :: getResourceLimit () (не очень хорошо на странице для setResourceLimit()
).
В моем цикле обработки изображений у меня есть set_time_limit(300)
, так как сценарию требуется много времени, чтобы обработать это огромное (при распаковке) изображение.
EDIT: В последних версиях
setResourceLimit()
следует вызывать не как статический метод, а вместо этого для реального объекта, например:
$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);