Утекает память при использовании ORM

Перевел более менее стандартные запросы на ORM, при этом наблюдаю утечку памяти, которая при уже 200 запросов в цикле превращается в проблему, каждый запрос дополнительные 1,2Мб Переменные за собой чищу, кеширование не использую.

Код вызова и код процедуры ниже:

memoryUsage(memory_get_usage(), $base_memory_usage);
$aViewerChannelGrid = $this->oEngine->PluginTvh4_Programs_ViewerProgramsGrid($oChannel->getId(), $next_date, (7 * 24 * 60 * 60) - 1);
memoryUsage(memory_get_usage(), $base_memory_usage);


    public function ViewerProgramsGrid($sNumKanal, $sDataStart, $sDateInterval, $sTimeZone = 3, $sLimit = 0)
    {
        $aFilter = array();

        $aFilter['#where'] = array(
            'channel_id = ?d and date_time BETWEEN ? and  DATE_ADD(?, interval ?d SECOND)'
            => array($sNumKanal, $sDataStart, $sDataStart, $sDateInterval));
        $aFilter['#cache'] = '';
        $aFilter['#order']['date_time'] = 'asc';

        if ($sLimit > 0) {
            $aFilter['#limit'] = $sLimit;
        }
        return ($this->PluginTvh4_ModulePrograms_GetItemsByFilter($aFilter));
    }


Выгружаю канал: 1 Смещение: 3
Bytes diff: 2090496
Bytes diff: 3104832
Выгружаю канал: 2 Смещение: 3
Bytes diff: 5362608
Bytes diff: 6391984
0% выполнения 
Выгружаю канал: 3 Смещение: 3
Bytes diff: 8151328
Bytes diff: 9130480
Выгружаю канал: 4 Смещение: 3
Bytes diff: 11167112
Bytes diff: 12199200
Выгружаю канал: 5 Смещение: 3
Bytes diff: 13787744
Bytes diff: 14859248
Выгружаю канал: 101 Смещение: 3
Bytes diff: 17022656
Bytes diff: 18310896
Выгружаю канал: 102 Смещение: 3
Bytes diff: 21423712
Bytes diff: 22202112

11 комментариев

avatar
Есть возможность тоже самое протестировать на версии с гита (2.0) — github.com/livestreet/livestreet?
  • ort
  • 0
avatar
Пока нет. Идет рефакторинг кода, очень много костылей.
avatar
Могу снять trace xdebug
avatar
Смысла дебага под 1.0 особо нет, нужно именно под 2.0, именно туда будут вноситься правки. И желательно версию php иметь от >5.4
avatar
Версия PHP старше. Нельзя просто так взять и перенести проект на новую версию LS :)
avatar
я не говорю о переносе проекта, достаточно перенести эту таблицу с данными и плагин/модуль для работы с ней по ORM, т.е. именно то, что будет запускать во время теста
avatar
Нашел частичного виновного: Вызов метода get на несуществующий столбец.

Предварительный итог -60%:

Выгружаю канал: 1 Смещение: 3
Bytes diff: 1187328
Bytes diff: 2198112
Выгружаю канал: 2 Смещение: 3
Bytes diff: 1927856
Bytes diff: 2949888
Выгружаю канал: 3 Смещение: 3
Bytes diff: 2293216
Bytes diff: 3222536
Выгружаю канал: 4 Смещение: 3
Bytes diff: 3113736
Bytes diff: 4134568
Выгружаю канал: 5 Смещение: 3
Bytes diff: 3380536
Bytes diff: 4442624
avatar
Очень удивился названию топика и проверил утекает ли память при использовании ORM — все оказалось в порядке — значит проблема не в коде фреймворка.

При указанном вызове есть только одно место, где утечку может спровоцировать твой код — инициализация сущностей модуля PluginTvh4_ModulePrograms.

Скинь код этой сущности PluginTvh4_ModulePrograms_EntityPrograms, можешь оставить только методы Init и __construct(). Скорее всего там ты что-то делаешь с ссылкой на текущий объект.
avatar
Как проверяли утечку? Пробовали вызвать один и тот же метод, скажем 40т. раз? :)
avatar
Да, именно так. Вызывал один и тот же метод 100 раз и затем 200 раз, затем сравнивал результаты по использованию памяти в первом и втором случае.
avatar
Отправил в личку
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.