Утекает память при использовании 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

Вопрос по записи данных в разные таблицы БД и ORM

Пробую написать плагин вопросов. Делаю по аналогии с топиками. В БД создаю две таблицы для вопросов:

CREATE TABLE IF NOT EXISTS `prefix_question` (
  `question_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) unsigned NOT NULL,
  `question_title` varchar(200) NOT NULL,
  `question_tags` varchar(250) NOT NULL COMMENT 'tags separated by a comma',
  `question_date_add` datetime NOT NULL,
  `question_date_edit` datetime DEFAULT NULL,
  `question_user_ip` varchar(20) NOT NULL,
  `question_publish_index` tinyint(1) NOT NULL DEFAULT '0',
  `question_count_read` int(11) unsigned NOT NULL DEFAULT '0',
  `question_cut_text` varchar(100) DEFAULT NULL,
  `question_text_hash` varchar(32) NOT NULL,
  PRIMARY KEY (`question_id`),
  KEY `user_id` (`user_id`),
  KEY `question_date_add` (`question_date_add`),
  KEY `question_text_hash` (`question_text_hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


CREATE TABLE IF NOT EXISTS `prefix_question_content` (
  `question_id` int(11) unsigned NOT NULL,
  `question_text` longtext NOT NULL,
  `question_text_short` text NOT NULL,
  `question_text_source` longtext NOT NULL,
  `question_extra` text NOT NULL,
  PRIMARY KEY (`question_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


Читать дальше →

Базовые вопросы по LiveStreet CMS

Всем привет! Я сейчас в поиске нового движка для своих разработок. С опенсорными php-движками как-то грустно все сейчас. Активно развиваются фреймворки, а КМС или совсем хилые, или очень устаревшие. Drupal 8 не оправдал надежд. Собирался даже свой движок писать, от отчаянья.
Случайно наткнулся на Ливстрит. В целом нравится. Хоть и плохо, что нет поддержки современных стандартов PSR. Но есть некоторые базовые вещи по структуре, которые не очень понятны. И прошу пояснить, кто может, или накидайте ссылок, где можно почитать, честно искал но не нашел.

Вот есть архитектура MVC. Про V и C я понял, V — это модуль на базе Smarty, а C здесь называются ActionXXX. А вот с M не очень понятно. Есть ModuleXXX, MapperXXX и EntityXXX. Это все к модели относится? А зачем тогда такое разделение было задумано? Наверно есть, какие-то причины?

И еще посоветуйте где почитать про ORM. А то нашел много статей про это на сайте, но хочется с самого начала понять как работат. Мне нравится как в yii это сделано. Но здесь сильно отличается.

Перевести запрос на ORM

Коллеги,
помогите перевести запрос на ORM.
Есть несколько таблиц справочников: tvh4_Name, tvh4_Genre, tvh4_Persons
Есть таблица связей Film, с полями: Film_ID, Type_record_ID,Object_ID.
Где:
Film_ID — номер фильма
Type_record_ID — справочник
Object_ID — объект справочника
Создано EntityORM для 3 справочников.

Не понимаю как реализовать логику для Film, в частности запрос вида:
$sql = "SELECT
Film.ID, Film.Film_ID, Film.Type_record_ID, Film.Object_ID, Name.Language_ID AS Name_Language_ID, 
		Name.Name_Text, Genre.Language_ID AS Genre_Language_ID, Genre_Text, 
		Persons.Language_ID AS Persons_Language_ID, Persons.Persons_Name
		FROM
		" . Config::Get('db.table.Film') . "
		AS Film
			LEFT JOIN tvh4.tvh4_Name Name ON ( Film.`Object_ID` = Name.ID AND Film.Type_record_ID =1 )
			LEFT JOIN tvh4.tvh4_Genre Genre ON ( Film.`Object_ID` = Genre.ID AND Film.Type_record_ID =2 )
			LEFT JOIN tvh4.tvh4_Persons Persons ON ( Film.`Object_ID` = Persons.ID
				AND ( Film.Type_record_ID =3 OR Film.Type_record_ID =4 OR Film.Type_record_ID =7 OR Film.Type_record_ID =8
				OR Film.Type_record_ID =9 OR Film.Type_record_ID =10 OR Film.Type_record_ID =11 OR Film.Type_record_ID =12
				OR Film.Type_record_ID =13 OR Film.Type_record_ID =14 OR Film.Type_record_ID =15)) 
		WHERE
		    Film.Film_ID IN (?a)
		ORDER BY Film.ID
		";

ORM и кеширование

У меня вопрос, как можно работать с ORM и Cache? Хочу некоторые данные поместить в кеш, но как проследить какие записи будут изменены? Например при команде ORM: Add, Save, Delete. Можно ли по ключу id отследить?

Установка дополнительных параметров для фильтра при вызове связи сущности ORM

Как известно в ORM LiveStreet CMS есть возможность указывать связи для сущности:

/*
 * Связи сущности
 */
protected $aRelations = array(
  /*
   * tip: сущности записывать в полном формате
   */
  'link_name' => array(EntityORM::RELATION_TYPE_HAS_MANY, 'ModuleTest_EntityTest', 'rel_row_id'),
);


Читать дальше →

ORM и float: то ли лыжи не едут, то ли...

Суть в чем, у меня при попытке использовать ORM с полями MySQL float ничего не получается. В базу пишутся нули, поскольку DbSimple, послушно следуя локали, преобразует точку в запятую и пытается подсунуть это MySQL, который с гневом это отвергает и записывает ноль. Если без ORM можно подсунуть в параметр буковку 'f', чтобы указать, что поле типа float, то как быть с ORM!?

Вот меня и терзают сомнения — неужели я первый наступаю на эти грабли?

ORM, many_to_many и несколько условий

Есть две таблицы Item и Category, связанные связью many_to_many через третью таблицу Link

Отношения Item:
protected $aRelations = array(
        'categories' => array(self::RELATION_TYPE_MANY_TO_MANY, 'PluginA_ModuleItem_EntityCategory', 'category_id', 'db.table.link', 'item_id'),
);

Отношения Category:
protected $aRelations = array(
        'items' => array(self::RELATION_TYPE_MANY_TO_MANY, 'PluginA_ModuleItem_EntityItem', 'item_id', 'db.table.link', 'category_id'),
);


Можно ли через ORM получить Itemы, принадлежащие определеннЫМ категориям и удовлетворяющие определенным условиям самой таблицы Items?.. Если бы речь шла об одной категории там все понятно, плясалось бы «от противного», то есть бралась бы эта самая категория и получались бы по фильтру айтемы, принадлежащие ей. А вот если хочется из нескольких категорий получить? Есть ORM путь или обратно к мэпперам?

Плагин с использованием ORM

Всем привет. Подскажите, пожалуйста, какой-нибудь бесплатный плагин, где используется ORM. Желательно как можно сложнее. В поиске по ORM не увидел, по тегу тоже, в поиске по плагинам какие-то есть, но не понять как движок связал их с ORM. Заранее спасибо.

Еще один вопрос по ORM

Всем привет!

Есть три таблицы:



Связь Entry описана:

    protected $aRelations = array(
        'resources' => array(self::RELATION_TYPE_MANY_TO_MANY,'ModuleResource_EntityResource', 'resource_id', 'db.table.resource_to_entry', 'entry_id')
    );


При запросе типа…
$colEntries = $this->Entry_GetEntryItemsByFilter(array(
                                                       'status'=>'published',
                                                       '#with' => array(),
                                                       '#order'=>array('date_begin' => 'asc'),
                                                       '#page' => array($page,$perpage)
                                                     ));


… загружается коллекция записей. В дальнейшем, при обходе коллекции в каждой итерации выполняется код:

$oEntry->getResources(array('resource_type'=>'IMAGE_THUMB_ENTRY_TYPE1','deleted'=>0)


Все работает, но не устраивает поток запросов к БД :(

Вопрос знатокам:

Есть ли способ загрузки всей коллекции ресурсов (к каждой записи entry) на этапе вызова Entry_GetEntryItemsByFilter?

Пробовал через #with. Не получилось. Утыкается в проверку типа связи, где и вызывает исключение.