Example #1
0
 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}] прошла валидацию и не была изменена");
 }
Example #2
0
 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;
 }