Zend_DB Out of memory bug
Привет,
Натолкнулся сегодня на один неприятный баг в Zend_DB при работе с “длинными типами данных”, которые часто используются для хранения неопределенных по размеру данных в MySQL. Как оказалось, Zend_DB некорректно работает с типом LONGTEXT И LONGBLOB и решение этой проблемы пока не найденно, но давайте посмотрим подробнее что все-таки можно сделать.
При попытке fetch, fetchAll, fetch*, find, findParentRow, findBy* или любой другой считывающей записи функции, я получал ошибку:
Fatal error: Out of memory (allocated 12058624) (tried to allocate 4294967294 bytes)
Отсюда видно, что Zend_DB пытался выделить 4 гигабайта памяти под будущий запрос! Что я считаю очень плохой практикой со стороны Zend Framework.
После нескольких часов изучения проблемы выяснилось, что при формирование sql запроса Zend_DB смотрит на типы полей таблицы, и видимо пытается выделить память под будущей массив записей для каждой ячейки таблицы в соответствии с ее максимальным размером. Сразу скажу, что общий объем тестируемой таблицы не превышал 10 Кб.
Структура таблицы была следующая:
CREATE TABLE `eventum_user` (
skipped...............
`usr_preferences` longtext,
skipped...............
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
Обратите внимание на поле usr_preferences, которое определено с типом данных LONGTEXT. Из документации MySQL выяснилось, что размер этого типа данных составляет 4GB (232 – 1) символов и именно столько Zend_DB пытался зарезервировать. ;-)
На Zend Developers Zone эту проблему к сожалению еще не решили.
И как временное решение я предлагаю просто изменить тип столбца из LONGTEXT (LONGBLOB) на MEDIUMTEXT (MEDIUMBLOB). Команда для конвертирования LONGTEXT В MEDIUMTEXT СЛЕДУЮЩАЯ:
alter table `eventum_user` change `usr_preferences` `usr_preferences` mediumtext NULL COLLATE utf8_general_ci
Для справки размер MEDIUMTEXT (MEDIUMBLOB) всего 16Mb и Zend_DB вполне комфортно с ним работает. ;-)
Ссылки по теме:


Огромное спасибо за блог!
Та же проблема, но “out of memory” не выдавал.
Вылетал Апаче с неизвестной ошибкой.
LONGTEXT->MEDIUMTEXT помогло!!!
Столкнулся еще, когда только начал работать с ZF, даже issue в Jira хотел написать, но тогда был на испытательном сроке и ограничился уведомлением Техлида :-)))).