private function validateGroup($group) { /** * Если зависимости от сущностей БД ещё не были проверены, * то запустим эту проверку и больше о валидности кешей, * зависящих от сущностей БД, можно не заботиться. * * Эту проверку нужно выполнять в любом случае, так как её запуск может * показать изменение сущностей фолдинга или самих фолдингов, работающих * с изменёнными таблицами/представлениями. */ DbChangeListener::check(); $this->TREE->setTypeValidated(self::CHILD_DBENTITY, 'Выполнена проверка изменений в БД'); /** * Если группа не валидируема - пропускаем. * Она могла стать валидируемой после проверки по базе. */ if (!$this->TREE->isGroupValidatable($group)) { return; //--- } $this->LOGGER->info(" > Валидируем группу кешей [{$group}]"); /* * Проверим, можно ли выполнить процесс и, если можно, выполним. * После выполнения о свежести логов можно будет не заботиться. */ $this->LOGGER->info(" ! Пытаемся выполнить внейший процесс"); if (ExternalProcess::inst()->executeFromClient()) { $this->TREE->setTypeValidated(self::CHILD_FOLDING, 'Выполнен внешний процесс от имени клиента'); return; //--- } /* * Если мы в продакшене - прекращаем дальнейшие проверки. * * Вообще говоря без полной проверки всех фолдингов, от которых зависит данная группа кеша, * считать группу провалидированной нельзя. Но если где-либо будет обнаружен изменённый * фолдинг, то это приведёт к вызову метода {@link #onFoldingChanged} и кеш всёже будет сброшен. */ $this->LOGGER->info(" ! Проверяем режим продакшн"); if (PsDefines::isProduction()) { $this->TREE->setTypeValidated(self::CHILD_FOLDING, 'Включён режим продакшн'); return; //--- } $foldings = $this->TREE->getChildsForValidate(self::CHILD_FOLDING, $group); $this->LOGGER->info(" ! Валидируем фолдинги"); foreach ($foldings as $fUnique) { $this->LOGGER->info(" ! Проверяем на изменение фолдинг [{$fUnique}]"); if (Handlers::getInstance()->getFoldingByUnique($fUnique)->checkFirstEntityChanged()) { //Выполним действия по оповещению об изменении $this->onFoldingChanged($fUnique); //Не будем проверять вообще все фолдинги, от которых мы зависим - это задача {@see ExternalProcess}. return; //--- } else { $this->TREE->onChildValidated(self::CHILD_FOLDING, $fUnique); } } $this->LOGGER->info(" < Группа кешей [{$group}] прошла валидацию и не была изменена"); }
private function checkEntityChanged($ident) { if (!$this->isVisibleEntity($ident)) { return false; //Не проверяем изменение для сущностей, которые пока не видны } //Проверим изменения сущностей по БД DbChangeListener::check(); if (in_array($ident, $this->CHANGE_CHECKED)) { return in_array($ident, $this->CHANGED_ENTITYS); //--- } check_condition($ident != self::PATTERN_NAME, "Некоректно проверять шаблон для сущности {$this->getEntityName()} на изменение."); $this->CHANGE_CHECKED[] = $ident; $this->LOGGER->info(''); $this->LOGGER->info("Check is entity [{$ident}] changed."); FoldedResourcesManager::onEntityAction(FoldedResourcesManager::ACTION_ENTITY_CHECK_CHANGED, $this, $ident); $this->AllEntityChangedChecked = count($this->CHANGE_CHECKED) >= count($this->getVisibleIdents()); if ($this->AllEntityChangedChecked) { $this->LOGGER->info('All entities was checked for change.'); FoldedResourcesManager::onEntityAction(FoldedResourcesManager::ACTION_FOLDING_ALL_CHECKED, $this); } $changed = !$this->getFromFoldedCache($ident, self::CACHE_CHANGE_PROCESS); /** * Если сущность не изменена, но есть фолдинги, от которых мы зависим - пробежимся по ним, * получим сущности родительских фолдингов, от которых мы зависим и проверим, не изменились ли они. */ if (!$changed && $this->isCanDependsOnEntitys($ident)) { $this->LOGGER->info("Entity [{$ident}] not need process change, but checking entitys we depends on."); /* @var $entity FoldedEntity */ foreach ($this->getEntitysWeDependsOn($ident) as $entity) { $pchanged = $entity->getFolding()->checkEntityChanged($entity->getIdent()); /* * Даже если мы нашли изменённую дочернюю сущность, всё равно проверим все дочерние сущности. */ $changed = $changed || $pchanged; $this->LOGGER->info("Parent entity [{$entity}] is {}.", $pchanged ? 'CHANGED' : 'not chenged'); } } $this->LOGGER->info('Entity [{}] {} process change.', $ident, $changed ? 'NEED' : 'not need'); if ($changed) { //Мы изменились, прийдётся обрабатывать изменение $this->onEntityChanged($ident); } return $changed; }