[20-Mar-2013 16:01:34] PHP Fatal error: Out of memory (allocated 65011712) (tried to allocate 13056 bytes) in .......... /protected/modules/images/components/CImageHandler.php on line 175
Хостинг "Агава" на моем тарифе предполагает 64М памяти. К сожалению, скрипту этого мало, а переходить на другой тариф не хочется. Как результат: фото более 800Кб не загружаются.
Решение:
1. открываем /protected/modules/images/components/CImageHandler.php
ищем эту самую строчку - 175
- Код: Выделить всё
$this->image = imagecreatetruecolor($this->width, $this->height);
$this->preserveTransparency($this->image);
imagecopy($this->image, $image['image'], 0, 0, 0, 0, $this->width, $this->height);
В этом месте съедается кусок памяти размером с картинку. Подозреваю, что тут GD еще что-то обрабатывает, кушает большой ресурс и вызывает Fatal, т.к. echo memory_get_usage(); показывает около 9,5Мб до и 12Мб после обработки на машине с бОльшим лимитом памяти.
Как я ни вкуривал этот код, так и не смог понять, зачем разработчик копирует содержимое картинки таким путем.
Возможно, т.к. $this->preserveTransparency, судя по названию, работает с прозрачностью, то здесь это нужно для прозрачных png. Поскольку к нашим делам все это не имеет отношения, закомментировал и его тоже.
В результате, сделал так:
- Код: Выделить всё
$this->image = $image['image'];
// $this->image = imagecreatetruecolor($this->width, $this->height);
// $this->preserveTransparency($this->image);
// imagecopy($this->image, $image['image'], 0, 0, 0, 0, $this->width, $this->height);
Расход памяти резко уменьшился :) А главное - работает :)
P.S. Наткнулся на следующие ограничения при памяти 64М:
-- Максимальный размер файла: 5 Мб (на сервере разрешено 8Мб).
-- Максимальное разрешение снимка 10 МПикс (~ 3600x2700).
иначе - ошибка.