Задать вопрос
Machez
@Machez
Бу!

Как устранить ошибку обработки больших изображений Allowed memory size на Yii2 через \yii\imagine\Image?

Имеется проект на Yii2. При попытке обработать большое изображение при помощи модуля \yii\imagine\Image возникает ошибка нехватки памяти.

Конкретный пример.

Загружаю JPG-файл размером 3,94 Мб (размер самого изображения 3024x5386 пикселей). И при попытке обработать открыть это изображение происходит ошибка:
code:1
file:"[ПУТЬ К ПРОЕКТУ]\vendor\imagine\imagine\lib\Imagine\Gd\Image.php"
line:622
message:"Allowed memory size of 268435456 bytes exhausted (tried to allocate 65028097 bytes)"
name: "PHP Fatal Error"

Вот код \vendor\imagine\imagine\lib\Imagine\Gd\Image.php:
...
private function createImage(BoxInterface $size, $operation)
    {
        $resource = imagecreatetruecolor($size->getWidth(), $size->getHeight());

        if (false === $resource) {
            throw new RuntimeException('Image '.$operation.' failed');
        }

        if (false === imagealphablending($resource, false) ||
            false === imagesavealpha($resource, true)) {
            throw new RuntimeException('Image '.$operation.' failed');
        }

        if (function_exists('imageantialias')) {
            imageantialias($resource, true);
        }

        $transparent = imagecolorallocatealpha($resource, 255, 255, 255, 127);
        imagefill($resource, 0, 0, $transparent); // <---------- СТРОКА 622 В КОТОРОЙ ПРОИСХОДИТ ОШИБКА
        imagecolortransparent($resource, $transparent);

        return $resource;
    }
...


Вот соответствующие параметры из PHP.INI:
...
realpath_cache_size=256M
memory_limit = 256M
...
upload_max_filesize = 5M
post_max_size = 5M
...


Неужели для обработки такого графического файла (характеристики я описывал выше) требуется больше 256 Мб памяти??? Или можно как-то это решить другим путём?
  • Вопрос задан
  • 1797 просмотров
Подписаться 1 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 4
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
вариантов несколько:
наиболее правильный сменить библиотеку gd на Imagick, она в разы меньше памяти кушает (раз в 10). но если таковой на сервере нет и нет возможности установить - тогда либо увеличить ОЗУ на сервере, либо ставить лимит в rules модели на максимальный размер фото.
Ответ написан
Комментировать
@pudovMaxim
web-developer
message:"Allowed memory size of 268435456 bytes exhausted (tried to allocate 65028097 bytes)"
Говорит, 256 Мб тютю, хочу еще 64Мб. Понятия не имею где взять, поэтому я пошел спать.

На тестовом окружении попробовать увеличить размеры памяти и посмотреть сколько надо. Но выглядит и действительно большим. Может где-то лишнего прихватывает.

Я бы еще проверил, верно ли определяется размер изображения здесь
$resource = imagecreatetruecolor($size->getWidth(), $size->getHeight());
Ответ написан
Комментировать
syamskoy
@syamskoy
Как уже написали, самое быстрое и хорошее решение: apt-get install php7.0-imagick. Подставить свою версию php.
В код изменений вносить не требуется, т.к. расширение само выбирает нужную библиотеку.
Ответ написан
@alexeytru
gc_collect_cycles(); - принудительный запуск сборщика мусора перед обработкой может помочь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы