Example #1
0
 /**
  * Метод отправляет письмо пользователю
  * 
  * @throws Exception
  */
 public function Send()
 {
     $PROFILER = PsProfiler::inst(__CLASS__);
     $PROFILER->start('Send');
     try {
         //Отправляем письмо
         $result = parent::Send();
         //Останавливаем профайлер
         $PROFILER->stop();
         //Сделаем дамп отправленного письма
         $this->dumpEmail();
         //Запишем аудит
         MailAudit::inst()->afterSended($this);
         //Вернём то, что вернул оригинальный Send метод
         return $result;
     } catch (Exception $ex) {
         //Останавливаем профайлер без сохранения
         $PROFILER->stop(false);
         //Если возникла ошибка отправки письма - сделаем её дамп вместе с письмом
         if ($ex instanceof phpmailerException) {
             ExceptionHandler::dumpError($ex, $this);
         }
         throw $ex;
     }
 }
Example #2
0
 public static final function finalize(PsLoggerInterface $LOGGER, $CONTENT)
 {
     //Проверим на пустоту
     if (isEmpty($CONTENT)) {
         return $CONTENT;
     }
     $call = ++self::$call;
     //Создадим экземпляр финализатора и вызовем его
     $class = get_called_class();
     $PROFILER = PsProfiler::inst($class);
     $inst = new $class($LOGGER, $PROFILER);
     $PROFILER->start(__FUNCTION__);
     $SECUNDOMER = Secundomer::startedInst();
     $LOGGER->infoBox(">>> CALLED {$call}. {$class}");
     try {
         $CONTENT = $inst->doFinalize($CONTENT);
         $PROFILER->stop();
         $SECUNDOMER->stop();
     } catch (Exception $ex) {
         $PROFILER->stop(false);
         $LOGGER->infoBox("Exception occured while calling {$class}::finalize. Message: " . $ex->getMessage());
         throw $ex;
     }
     $LOGGER->infoBox("<<< CALL {$call}. {$class} FINISHED IN " . $SECUNDOMER->getAverage() . ' seconds');
     return $CONTENT;
 }
Example #3
0
 private function __construct(array $params)
 {
     ExternalPluginsManager::SpriteGenerator();
     $this->CssSpriteGen = new CssSpriteGen($params);
     $this->LOGGER = PsLogger::inst(__CLASS__);
     $this->PROFILER = PsProfiler::inst(__CLASS__);
 }
 private function __construct(array $params)
 {
     PsLibs::inst()->SpriteGenerator();
     $this->CssSpriteGen = new CssSpriteGen($params);
     $this->LOGGER = PsLogger::inst(__CLASS__);
     $this->PROFILER = PsProfiler::inst(__CLASS__);
 }
Example #5
0
 /** @return ADORecordSet */
 private static function executeQuery($query, $params = false, &$queryFinal = null, array &$paramsFinal = null)
 {
     $queryFinal = $query instanceof Query ? $query->build($params) : $query;
     $queryFinal = normalize_string($queryFinal);
     $paramsFinal = to_array($params);
     $LOGGER = PsLogger::inst(__CLASS__);
     $PROFILER = PsProfiler::inst(__CLASS__);
     $PROFILER->start(strtolower($queryFinal));
     try {
         if ($LOGGER->isEnabled()) {
             $LOGGER->info("[{$queryFinal}]" . ($paramsFinal ? ', PARAMS: ' . array_to_string($paramsFinal) : ''));
         }
         $rs = PsConnectionPool::conn()->execute($queryFinal, $paramsFinal);
         if (is_object($rs)) {
             $PROFILER->stop();
             return $rs;
         }
         $error = PsConnectionPool::conn()->ErrorMsg();
         $LOGGER->info('ERROR: {}', $error);
         throw new DBException($error, DBException::ERROR_NOT_CLASSIFIED, $queryFinal, $paramsFinal);
     } catch (Exception $ex) {
         $PROFILER->stop(false);
         if ($ex instanceof DBException) {
             ExceptionHandler::dumpError($ex);
         }
         throw $ex;
     }
 }
Example #6
0
 /**
  * Основной метод получения экземпляра.
  * 
  * @param type $silentOnDoubleTry - признак, стоит ли нам ругаться, если мы 
  * обнаруживаем зацикливание при попытке получения экземпляра класса.
  * 
  * Это нужно для классов, которые выполняют сложную логику в конструкторе, которая
  * может привести к повторному вызову ::inst() внутри этого конструктора.
  * 
  * Классы, которые используют эту возможность:
  * @link DbChangeListener - менеджер прослушивания изменений в БД
  */
 protected static function inst($silentOnDoubleTry = false)
 {
     $class = get_called_class();
     if (array_key_exists($class, self::$_insts_)) {
         return self::$_insts_[$class];
     }
     if (array_key_exists($class, self::$_instsrq_)) {
         if ($silentOnDoubleTry) {
             return null;
         }
         raise_error("Double try to get singleton of [{$class}]");
     }
     self::$_instsrq_[$class] = true;
     //Создаём экземпляр
     $sec = Secundomer::startedInst("Creating singleton of {$class}");
     self::$_insts_[$class] = new $class();
     $sec->stop();
     //Экземпляр успешно создан
     unset(self::$_instsrq_[$class]);
     //Теперь добавим в профайлер. Всё это нужно для защиты от зацикливания.
     PsProfiler::inst(__CLASS__)->add($class, $sec);
     //Добавим к глобальному секундомеру - текущий
     $SECUNDOMER = self::$_secundomer_ ? self::$_secundomer_ : (self::$_secundomer_ = Secundomer::inst());
     $SECUNDOMER->addSecundomer($sec);
     //Отлогируем
     PsLogger::inst(__CLASS__)->info("+ {$class} ({$sec->getAverage()} / {$SECUNDOMER->getTotalTimeRounded()})");
     return self::$_insts_[$class];
 }
Example #7
0
 public function getStructure()
 {
     $cacheId = AuthManager::isAuthorized() ? 'a' : 'na' . '_structure';
     $structure = PSCache::POSTS()->getFromCache($cacheId);
     if (!is_array($structure)) {
         PsProfiler::inst(__CLASS__)->start('Build structure');
         $structure = $this->getStructureImpl()->toArray();
         PsProfiler::inst(__CLASS__)->stop();
         PSCache::POSTS()->saveToCache($structure, $cacheId);
     }
     return $structure;
 }
Example #8
0
 /**
  * Метод валидирует все доступные db.ini
  */
 public static function validateAll()
 {
     PsProfiler::inst(__CLASS__)->start(__FUNCTION__);
     $errors = array();
     foreach (ConfigIni::getAllowedScopes() as $scope) {
         $err = self::validateIni($scope);
         if ($err) {
             $errors[$scope] = $err;
         }
     }
     PsProfiler::inst(__CLASS__)->stop();
     return $errors;
 }
Example #9
0
 /**
  * Загружает список всех изменений, произошедших в базе.
  */
 public function getChangedEntitys()
 {
     PsProfiler::inst(__CLASS__)->start(__FUNCTION__);
     //Первым делом проверим состояние представлений, возможно они изменены
     $this->update('call checkViewsState()');
     //Загрузим все изменённые сущности
     $CHANGED = $this->getArray('select v_entity, v_type from ps_db_changes order by v_type');
     if ($CHANGED) {
         //Очищаем историю изменений
         $this->update('delete from ps_db_changes');
     }
     PsProfiler::inst(__CLASS__)->stop();
     return $CHANGED;
 }
Example #10
0
 private function __construct($id)
 {
     $this->id = 1 * $id;
     $this->BEAN = MosaicImgBean::inst();
     $params = ArrayAdapter::inst($this->BEAN->getImgInfo($this->id));
     $this->width = $params->int('w');
     $this->height = $params->int('h');
     $this->cellsXcnt = $params->int('cx');
     $this->cellsYcnt = $params->int('cy');
     $this->cellWidth = $params->int('cw');
     $this->cellHeight = $params->int('ch');
     $this->cellsTotal = $this->cellsXcnt * $this->cellsYcnt;
     $this->LOGGER = PsLogger::inst(__CLASS__);
     $this->PROFILER = PsProfiler::inst(__CLASS__);
     $this->tryResyncImg();
 }
Example #11
0
 /**
  * Метод возвращает карту: сущность фолдинга=>массив сущностей, от которых она зависит.
  * При этом зависимость сущности от фолдинга будет только в том случае, если сама сущность сохранила об этом информацию в кеше.
  * Не сохраняем построенную карту в переменную класса, так как карта может измениться.
  */
 public function getDependsOnMap()
 {
     PsProfiler::inst(__CLASS__)->start(__FUNCTION__);
     $result = array();
     /* @var $folding FoldedResources */
     foreach (Handlers::getInstance()->getFoldings() as $folding) {
         if ($folding->isCanDependsOnEntitys()) {
             foreach ($folding->getVisibleIdents() as $ident) {
                 /* @var $ent FoldedEntity */
                 foreach ($folding->getEntitysWeDependsOn($ident) as $parentUq => $ent) {
                     $result[$folding->getUnique($ident)][] = $parentUq;
                 }
             }
         }
     }
     PsProfiler::inst(__CLASS__)->stop();
     return $result;
 }
Example #12
0
 protected function executeImpl(ArrayAdapter $params)
 {
     $action = $params->str('action');
     $controller = PsProfiler::controller();
     switch ($action) {
         case 'reset':
             $controller->resetAll();
             break;
         case 'on':
             $controller->setProfilingEnabled(true);
             break;
         case 'off':
             $controller->setProfilingEnabled(false);
             break;
         default:
             json_error("Unknown action [{$action}].");
     }
     return new AjaxSuccess();
 }
Example #13
0
 private function executeImpl($lifeTimeOnCall, $__FUNCTION__)
 {
     if ($this->called) {
         return $this->executed;
         //---
     }
     $this->called = true;
     $LOGGER = PsLogger::inst(__CLASS__);
     $LOGGER->info("Function [{$__FUNCTION__}] called.");
     $needProcess = false;
     $LOCKFILE = DirManager::autogen('service')->getDirItem(null, __CLASS__, 'lock');
     if ($LOCKFILE->isFile()) {
         $lifeTime = $LOCKFILE->getFileLifetime();
         $needProcess = !$lifeTime || !$lifeTimeOnCall || $lifeTime >= $lifeTimeOnCall;
         $LOGGER->info('{} process. Lock file modified {} seconds ago. Process delay: {} seconds.', $needProcess ? 'Need' : 'Not need', $lifeTime, $lifeTimeOnCall);
     } else {
         $needProcess = true;
         $LOGGER->info('Need process. Lock file is not exists.');
     }
     if (!$needProcess) {
         return $this->executed;
         //---
     }
     $locked = PsLock::lock(__CLASS__, false);
     $LOGGER->info('External process lock {} execution.', $locked ? 'acquired, start' : 'not acquired, skip');
     if ($locked) {
         $LOCKFILE->touch();
         PsUtil::startUnlimitedMode();
         //Отпустим лок, так как внутри он может потребоваться для выполнения других действий, например для перестройки спрайтов
         PsLock::unlock();
         //Начинаем выполнение
         $this->executed = true;
         $job = new ExternalProcessJob();
         PsProfiler::inst(__CLASS__)->start(__FUNCTION__);
         $job->execute();
         $secundomer = PsProfiler::inst(__CLASS__)->stop();
         if ($secundomer) {
             $LOGGER->info("{$secundomer}");
         }
     }
     return $this->executed;
 }
 /**
  * Основной метод, выполняющий выполнение Ajax действия.
  * 
  * @return AjaxSuccess
  */
 public final function execute()
 {
     $id = get_called_class();
     check_condition(!$this->processed, "Действие [{$id}] уже выполнено.");
     $this->processed = true;
     //Не будем портить глобальный массив $_REQUEST, создав копию адаптера
     $params = RequestArrayAdapter::inst()->copy();
     check_condition($params->str(AJAX_ACTION_PARAM) == $id, "Действие [{$id}] не может быть выполнено.");
     $params->remove(AJAX_ACTION_PARAM);
     $params->remove(AJAX_ACTION_GROUP_PARAM);
     //Проверка доступа
     AuthManager::checkAccess($this->getAuthType());
     //Если пользователь зарегистрирован, как администратор - подключим ресурсы админа
     //ps_admin_on();
     //Проверка обязательных параметров
     foreach (to_array($this->getRequiredParamKeys()) as $key) {
         if (!$params->has($key)) {
             return "Не передан обязательный параметр [{$key}].";
         }
     }
     //Проверка активности
     if ($this->isCheckActivity() && !ActivityWatcher::isCanMakeAction()) {
         return 'Таймаут не закончился.';
     }
     //Вызываем обработку данных
     PsProfiler::inst('AjaxProfiler')->start($id);
     $result = $this->executeImpl($params);
     PsProfiler::inst('AjaxProfiler')->stop();
     if (isEmpty($result)) {
         return "Действие [{$id}] выполнено некорректно - возвращён пустой результат.";
     }
     if (is_object($result) && $result instanceof AjaxSuccess) {
         //SUCCESS
         //Зарегистрируем активноcть пользователя (только в случае успеха, так как пользователь мог просто ошибиться в воде данных)
         if ($this->isCheckActivity()) {
             ActivityWatcher::registerActivity();
         }
     }
     return $result;
 }
Example #15
0
 public function buildContent()
 {
     $navigation = AdminPageNavigation::inst();
     $RQ = GetArrayAdapter::inst();
     $AL = PsProfiler::controller();
     $PARAMS['enabled'] = PROFILING_ENABLED;
     $mode = null;
     if ($RQ->has('profiler')) {
         $mode = self::MODE_PROFILER;
         $profiler = $RQ->str('profiler');
         $PARAMS['profilers'] = $AL->getStats($profiler);
         $navigation->addPath(self::url(), 'Профайлеры');
         $navigation->setCurrent($profiler);
     }
     if (!$mode) {
         $mode = self::MODE_LIST;
         $PARAMS['profilers'] = $AL->getStats();
         $navigation->setCurrent('Профайлеры');
     }
     $PARAMS['mode'] = $mode;
     echo $this->getFoldedEntity()->fetchTpl($PARAMS);
 }
Example #16
0
 private function __construct()
 {
     PsProfiler::inst(__CLASS__)->start(__FUNCTION__);
     //Фолдинги
     $this->foldings[] = PopupPagesManager::inst();
     $this->foldings[] = PluginsManager::inst();
     $this->foldings[] = TimeLineManager::inst();
     $this->foldings[] = UserPointsManager::inst();
     $this->foldings[] = StockManager::inst();
     $this->foldings[] = HelpManager::inst();
     $this->foldings[] = EmailManager::inst();
     $this->foldings[] = PSForm::inst();
     $this->foldings[] = DialogManager::inst();
     //Библиотеки
     $this->foldings[] = PoetsManager::inst();
     $this->foldings[] = ScientistsManager::inst();
     //Админские страницы
     $this->foldings[] = APagesResources::inst();
     /*
      * Выделим различные подклассы фолдингов
      */
     foreach ($this->foldings as $folding) {
         //Фолдинги библиотек
         if ($folding instanceof LibResources) {
             $this->libs[] = $folding;
         }
         //Фолдинги для баблов
         if ($folding instanceof BubbledFolding) {
             $this->bubbles[] = $folding;
         }
         //Фолдинги, предоставляющие панели
         if ($folding instanceof PanelFolding) {
             $this->panels[] = $folding;
         }
     }
     PsProfiler::inst(__CLASS__)->stop();
 }
Example #17
0
 /**
  * Конструктор. В нём мы составим полный список директорий, в которых потом будет производиться поиск
  * 
  * @param type $absDirPath
  * @param array $excluded
  * @param array $included
  */
 private function __construct($absDirPath, array $excluded, array $included)
 {
     $this->LOGGER = PsLogger::inst(__CLASS__);
     $this->PROFILER = PsProfiler::inst(__CLASS__);
     $this->PATH = ensure_dir_endswith_dir_separator($absDirPath);
     $this->LOGGER->info("Dir: [{$this->PATH}]");
     foreach ($excluded as $dir) {
         $path = ensure_dir_endswith_dir_separator(array($absDirPath, $dir));
         $this->EXCLUDED[] = $path;
         $this->LOGGER->info("ExcludeDir: [{$path}]");
     }
     foreach ($included as $dir) {
         $path = ensure_dir_endswith_dir_separator(array($absDirPath, $dir));
         $this->INCLUDED[] = $path;
         $this->LOGGER->info("IncludeDir: [{$path}]");
     }
     $this->LOGGER->info('Filling dirs for search');
     $this->PROFILER->start('Fill search dirs');
     $this->fillWithDirs($this->PATH);
     $this->LOGGER->info('Total dirs for search count: {}, excluded dirs: {}. Taken time: {}sec.', count($this->DIRS), count($this->DIRSEXCLUDED), $this->PROFILER->stop()->getTime());
     foreach ($this->DIRSEXCLUDED as $path) {
         $this->LOGGER->info("- {$path}");
     }
 }
Example #18
0
 /**
  * В конструкторе зарегистрируем все страницы
  */
 protected final function __construct()
 {
     $class = get_called_class();
     $basic = __CLASS__ == $class;
     //Логгер
     $this->LOGGER = PsLogger::inst(__CLASS__);
     $this->LOGGER->info('USING {} PLUGIN PROVIDER: {}', $basic ? 'SDK' : 'CUSTOM', $class);
     //Стартуем профайлер
     $this->PROFILER = PsProfiler::inst(__CLASS__);
     $this->PROFILER->start('Loading plugins');
     //Регистрируем фолдинги SDK
     $this->LOGGER->info();
     $this->LOGGER->info('PLUGINS SDK:');
     $this->registerSdkSmartyPlugins();
     //Если используем не SDK провайдер, вызываем регистратор
     if (!$basic) {
         $this->LOGGER->info();
         $this->LOGGER->info('PLUGINS PROJECT:');
         $this->registerProjectSmartyPlugins();
     }
     //Останавливаем профайлер
     $sec = $this->PROFILER->stop();
     //Логируем
     $this->LOGGER->info();
     $this->LOGGER->info('COLLECTING TIME: {} sec', $sec->getTotalTime());
 }
Example #19
0
 /**
  * КОНСТРУКТОР
  */
 protected function __construct()
 {
     $this->CLASS = get_called_class();
     $this->INSTS_CACHE = new SimpleDataCache();
     $this->UNIQUE = self::unique($this->getFoldingType(), $this->getFoldingSubType());
     $this->LOGGER = PsLogger::inst(__CLASS__ . '-' . $this->UNIQUE);
     $this->PROFILER = PsProfiler::inst(__CLASS__);
     $this->RESOURCE_TYPES_LINKED = array_intersect($this->RESOURCE_TYPES_ALLOWED, $this->RESOURCE_TYPES_LINKED);
     $this->RESOURCE_TYPES_CHECK_CHANGE = array_intersect($this->RESOURCE_TYPES_ALLOWED, $this->RESOURCE_TYPES_CHECK_CHANGE);
     //Получим текстовое описание
     $this->TO_STRING = $this->getTextDescr();
     /*
      * Проверим, что заданы размеры обложки по умолчанию, если мы работаем с картинками
      */
     if ($this->isImagesFactoryEnabled() && !$this->defaultDim()) {
         raise_error("Не заданы размеры обложки по умолчанию для фолдинга {$this}");
     }
     /*
      * Последовательность, однозначно идентифицирующая фолдинг и используемыя в различных 
      * ситуациях для связи фолдинга и его сущностей, таких как:
      * смарти функции, класс и т.д.
      * Пример: trpost, pl и т.д.
      */
     $SRC_PREFIX = trim($this->getFoldingSubType()) . $this->getFoldingType();
     $this->SMARTY_PREFIX = $SRC_PREFIX;
     //Если мы используем php-классы, то проверим, корректно ли задан префикс классов
     if ($this->isAllowedResourceType(self::RTYPE_PHP)) {
         $this->CLASS_PREFIX = strtoupper($SRC_PREFIX) . '_';
         $this->CLASS_PATH_BASE = ensure_dir_endswith_dir_separator($this->getResourcesDm()->absDirPath());
     }
     //Разберём настройки хранения фолдингов в базе
     if ($this->isWorkWithTable()) {
         $dbs = explode('.', trim($this->foldingTable()));
         $this->TABLE_VIEW = array_get_value(0, $dbs);
         $this->TABLE = cut_string_start($this->TABLE_VIEW, 'v_');
         $this->TABLE_COLUMN_IDENT = array_get_value(1, $dbs);
         $this->TABLE_COLUMN_STYPE = array_get_value(2, $dbs);
         check_condition(!!$this->TABLE && !!$this->TABLE_COLUMN_IDENT, "Некорректные настройки работы с базой для фолдинга {$this}");
         if ($this->TABLE_COLUMN_STYPE) {
             check_condition($this->hasSubType(), "Некорректные настройки работы с базой. Фолдинг {$this} не имеет подтипа.");
         }
     }
 }
Example #20
0
 protected function __construct()
 {
     $this->LOGGER = PsLogger::inst(__CLASS__);
     $this->PROFILER = PsProfiler::inst(__CLASS__);
     $this->CACHE = SimpleDataCache::inst();
     $this->DM = DirManager::autoNoDel(DirManager::DIR_FORMULES);
 }
Example #21
0
 /**
  * В конструкторе пробежимся по всем хранилищам и соберём все фолдинги
  */
 protected function __construct()
 {
     $this->LOGGER = PsLogger::inst(__CLASS__);
     $this->PROFILER = PsProfiler::inst(__CLASS__);
     $this->PROFILER->start('Loading folding entities');
     /*
      * Пробегаемся по всему, настроенному в foldings.ini
      */
     foreach (FoldingsIni::foldingsRel() as $foldedUnique => $dirRelPathes) {
         $this->FOLDING_2_ENTITY_2_ENTABSPATH[$foldedUnique] = array();
         $this->FOLDING_2_ENTITY_2_ENTRELPATH[$foldedUnique] = array();
         /*
          * Загрузим карту сущностей
          */
         foreach (array_unique($dirRelPathes) as $dirRelPath) {
             $dm = DirManager::inst($dirRelPath);
             foreach ($dm->getSubDirNames() as $entity) {
                 //Не будем проверять наличие этой сущности, более поздние смогут её переопределить
                 //array_key_exists($entity, $this->FOLDING_2_ENTITY_2_ENTABSPATH[$foldedUnique])
                 $this->FOLDING_2_ENTITY_2_ENTABSPATH[$foldedUnique][$entity] = $dm->absDirPath($entity);
                 $this->FOLDING_2_ENTITY_2_ENTRELPATH[$foldedUnique][$entity] = $dm->relDirPath($entity);
             }
         }
         ksort($this->FOLDING_2_ENTITY_2_ENTABSPATH[$foldedUnique]);
         ksort($this->FOLDING_2_ENTITY_2_ENTRELPATH[$foldedUnique]);
         /*
          * Построим карты сущностей к типам фолдингов, чтобы мы могли через них выйти на фолдинг
          */
         self::extractFoldedTypeAndSubtype($foldedUnique, $ftype, $fsubtype);
         /*
          * Построим карту отношения идентификатора фолдинга к коду ресурса
          * slib => lib-s
          */
         $this->SOURCE_2_FOLDING[$fsubtype . $ftype] = $foldedUnique;
         /*
          * Построим карту отношения идентификатора фолдинга к префиксу класса
          * SLIB_ => lib-s
          */
         $this->CLASSPREFIX_2_FOLDING[strtoupper($fsubtype . $ftype) . '_'] = $foldedUnique;
         /*
          * Построим карту отношения типа фолдинга к массиву подтипов фолдингов
          * lib => array('s', 'p')
          * pl = > null
          */
         if (array_key_exists($ftype, $this->TYPE_2_STYPE)) {
             //Если мы второй раз попали в этот блок для типа фолдинга, то он должен иметь подтип [lib=>array('s')].
             check_condition(is_array($this->TYPE_2_STYPE[$ftype]), "Уже зарегистрирован фолдинг с типом [{$ftype}] без подтипов");
             $this->TYPE_2_STYPE[$ftype][] = check_condition($fsubtype, "Уже зарегистрирован фолдинг с типом [{$ftype}] и с подтипами");
         } else {
             if ($fsubtype) {
                 //Новый тип фолдинга с подтипом.
                 $this->TYPE_2_STYPE[$ftype] = array($fsubtype);
             } else {
                 //Новый тип фолдинга без подтипа.
                 $this->TYPE_2_STYPE[$ftype] = null;
             }
         }
     }
     //Отсортируем по уникальным кодам фолдингов
     ksort($this->FOLDING_2_ENTITY_2_ENTABSPATH);
     ksort($this->FOLDING_2_ENTITY_2_ENTRELPATH);
     ksort($this->TYPE_2_STYPE);
     //Установим идентификаторы фолдингов
     $this->FOLDINGS = array_keys($this->FOLDING_2_ENTITY_2_ENTRELPATH);
     $sec = $this->PROFILER->stop();
     if ($this->LOGGER->isEnabled()) {
         $this->LOGGER->info('FOLDINGS: {}', print_r($this->FOLDINGS, true));
         $this->LOGGER->info('FOLDING_2_ENTITY_2_ENTABSPATH: {}', print_r($this->FOLDING_2_ENTITY_2_ENTABSPATH, true));
         $this->LOGGER->info('FOLDING_2_ENTITY_2_ENTRELPATH: {}', print_r($this->FOLDING_2_ENTITY_2_ENTRELPATH, true));
         $this->LOGGER->info('TYPE_2_STYPE: {}', print_r($this->TYPE_2_STYPE, true));
         $this->LOGGER->info('CLASSPREFIX_2_FOLDING: {}', print_r($this->CLASSPREFIX_2_FOLDING, true));
         $this->LOGGER->info('SOURCE_2_FOLDING: {}', print_r($this->SOURCE_2_FOLDING, true));
         $this->LOGGER->info('BUILDING_TIME: {} sec', $sec->getTotalTime());
     }
 }
Example #22
0
 /**
  * Переопределим конструктор
  */
 protected final function __construct()
 {
     check_condition(PsEnvironment::isIncluded(), 'Can use ' . __CLASS__ . ' only when environment is included');
     $UQ = __CLASS__ . '-' . PsEnvironment::env();
     $this->LOGGER = PsLogger::inst($UQ);
     $this->PROFILER = PsProfiler::inst($UQ);
     $this->_construct();
 }
Example #23
0
 /** @return PsProfiler */
 public static function controller()
 {
     return isset(self::$inst) ? self::$inst : (self::$inst = new PsProfiler());
 }
Example #24
0
 private function __construct()
 {
     PsProfiler::inst(__CLASS__)->start(__FUNCTION__);
     $managers = array(MagManager::inst(), BlogManager::inst(), TrainManager::inst());
     foreach ($managers as $manager) {
         //Соберём типы постов
         $this->postTypes[] = $manager->getPostType();
         if ($manager instanceof RubricsProcessor) {
             $this->rubricsProcessors[$manager->getPostType()] = $manager;
             $this->foldings[] = $manager->getRubricsFolding();
         }
         if ($manager instanceof PostsProcessor) {
             $this->postsProcessors[$manager->getPostType()] = $manager;
             $this->foldings[] = $manager->getFolding();
         }
         if ($manager instanceof CommentsProcessor) {
             $this->commentProcessors[$manager->getPostType()] = $manager;
             $this->discussionControllers[$manager->getDiscussionController()->getDiscussionUnique()] = $manager->getDiscussionController();
         }
         if ($manager instanceof PagePreloadListener) {
             $this->pagePreloadListeners[] = $manager;
         }
         if ($manager instanceof NewsProvider) {
             $this->newsProviders[$manager->getNewsEventType()] = $manager;
         }
     }
     //Контроллеры дискуссий
     $this->discussionControllers[FeedbackManager::inst()->getDiscussionUnique()] = FeedbackManager::inst();
     //Фолдинги
     $this->foldings[] = PopupPagesManager::inst();
     $this->foldings[] = PluginsManager::inst();
     $this->foldings[] = IdentPagesManager::inst();
     $this->foldings[] = TimeLineManager::inst();
     $this->foldings[] = TemplateMessages::inst();
     $this->foldings[] = UserPointsManager::inst();
     $this->foldings[] = StockManager::inst();
     $this->foldings[] = HelpManager::inst();
     $this->foldings[] = EmailManager::inst();
     $this->foldings[] = PSForm::inst();
     $this->foldings[] = DialogManager::inst();
     //Библиотеки
     $this->foldings[] = PoetsManager::inst();
     $this->foldings[] = ScientistsManager::inst();
     //Админские страницы
     $this->foldings[] = APagesResources::inst();
     //Базовые страницы
     $this->foldings[] = BasicPagesManager::inst();
     //Построитель страниц
     $this->foldings[] = PageBuilder::inst();
     //Управление списком предпросмотра постов
     $this->foldings[] = ShowcasesCtrlManager::inst();
     //Элементы в правой панели навигации
     $this->foldings[] = ClientBoxManager::inst();
     /*
      * Выделим различные подклассы фолдингов
      */
     foreach ($this->foldings as $folding) {
         //Фолдинги библиотек
         if ($folding instanceof LibResources) {
             $this->libs[] = $folding;
         }
         //Фолдинги обработчиков постов
         if ($folding instanceof PostFoldedResources) {
             $this->postProcessorFoldings[] = $folding;
         }
         //Фолдинги для баблов
         if ($folding instanceof BubbledFolding) {
             $this->bubbles[] = $folding;
         }
         //Фолдинги, предоставляющие панели
         if ($folding instanceof PanelFolding) {
             $this->panels[] = $folding;
         }
         //Фолдинги, финализирующие контент страницы
         if ($folding instanceof PageFinalizerFolding) {
             $this->pageFinaliseFoldings[] = $folding;
         }
         //Индексированный список фолдингов
         $this->folding2unique[$folding->getUnique()] = $folding;
         //Префиксы smarty к фолдингам
         $this->folding2smartyPrefix[$folding->getSmartyPrefix()] = $folding;
         //Префиксы классов к фолдингам
         if ($folding->getClassPrefix()) {
             $this->folding2classPrefix[$folding->getClassPrefix()] = $folding;
         }
     }
     PsProfiler::inst(__CLASS__)->stop();
 }
Example #25
0
 /**
  * Метод вызывается для выполнения периодических задач cron
  * 
  * @return type
  */
 public function execute()
 {
     if ($this->called) {
         return $this->executed;
         //---
     }
     $this->called = true;
     $LOGGER = PsLogger::inst(__CLASS__);
     $LOGGER->info('Executing {}', __CLASS__);
     /*
      * Получим список классов, которые нужно выполнить
      */
     $processes = ConfigIni::cronProcesses();
     if (empty($processes)) {
         $LOGGER->info('No cron processes configured, fast return...');
         return $this->executed;
         //---
     }
     $processes = array_unique($processes);
     $LOGGER->info('Configured processes: {}', array_to_string($processes));
     foreach ($processes as $class) {
         if (!PsUtil::isInstanceOf($class, 'PsCronProcess')) {
             PsUtil::raise("Class {$class} cannot be executed as cron process, it should be instance of PsCronProcess");
         }
     }
     $locked = PsLock::lock(__CLASS__, false);
     $LOGGER->info('Lock accured ? {}', var_export($locked, true));
     if (!$locked) {
         return $this->executed;
         //---
     }
     $LOCKFILE = DirManager::autoNoDel(DirManager::DIR_SERVICE)->getDirItem(null, __CLASS__, PsConst::EXT_LOCK);
     $LOCKFILE_LIFETIME = $LOCKFILE->getFileLifetime();
     $MAX_LIFETIME = 5 * 60;
     $NED_PROCESS = $LOCKFILE_LIFETIME === null || $LOCKFILE_LIFETIME > $MAX_LIFETIME;
     $LOGGER->info("Lock file {}: {}", $LOCKFILE_LIFETIME === null ? 'NOT EXISTS' : 'EXISTS', $LOCKFILE->getRelPath());
     if ($LOCKFILE_LIFETIME !== null) {
         $LOGGER->info('Last modified: {} seconds ago. Max process delay: {} seconds.', $LOCKFILE_LIFETIME, $MAX_LIFETIME);
         //
     }
     if (!$NED_PROCESS) {
         $LOGGER->info('Skip execution.');
         //Отпустим лок
         PsLock::unlock();
         //Выходим
         return $this->executed;
         //---
     }
     //Обновим время последнего выполнения
     $LOCKFILE->touch();
     //Отпустим лок, так как внутри он может потребоваться для выполнения других действий, например для перестройки спрайтов
     PsLock::unlock();
     $LOGGER->info();
     $LOGGER->info('External process execution started...');
     //Запускаем режим неограниченного выполнения
     PsUtil::startUnlimitedMode();
     //Начинаем выполнение
     $this->executed = true;
     //Создаём профайлер
     $PROFILER = PsProfiler::inst(__CLASS__);
     //Создадим конфиг выполнения процесса
     $config = new PsCronProcessConfig();
     //Пробегаемся по процессам и выполняем. При первой ошибке - выходим.
     foreach ($processes as $class) {
         $LOGGER->info('Executing cron process {}', $class);
         $PROFILER->start($class);
         try {
             $inst = new $class();
             $inst->onCron($config);
             $secundomer = $PROFILER->stop();
             $LOGGER->info(" > Cron process '{}' executed in {} seconds", $class, $secundomer->getTotalTime());
         } catch (Exception $ex) {
             $PROFILER->stop();
             $LOGGER->info(" > Cron process '{}' execution error: '{}'", $class, $ex->getMessage());
         }
     }
     $LOGGER->info('Removing cron lock file.');
     $LOCKFILE->remove();
     return $this->executed;
 }
Example #26
0
 protected function __construct()
 {
     PsUtil::assertClassHasDifferentConstValues(__CLASS__, 'TYPE_');
     $this->LOGGER = PsLogger::inst(__CLASS__);
     $this->PROFILER = PsProfiler::inst(__CLASS__);
     $this->CACHE = new SimpleDataCache();
 }
Example #27
0
 public function getProfiler()
 {
     return PsProfiler::inst(__CLASS__);
 }
 /**
  * В конструкторе зарегистрируем все страницы
  */
 protected final function __construct()
 {
     //Инициализируем хранилище, чтобы честно замерять время создания регистрации самих экземпляров
     FoldedStorage::init();
     $class = get_called_class();
     $basic = __CLASS__ == $class;
     //Логгер
     $this->LOGGER = PsLogger::inst(__CLASS__);
     $this->LOGGER->info('USING {} STORAGE: {}', $basic ? 'SDK' : 'CUSTOM', $class);
     //Стартуем профайлер
     $this->PROFILER = PsProfiler::inst(__CLASS__);
     $this->PROFILER->start('Loading folding insts');
     //Регистрируем фолдинги SDK
     $this->LOGGER->info();
     $this->LOGGER->info('FOLDINGS SDK:');
     $this->registerSdkFoldings();
     //Если используем не SDK провайдер, вызываем регистратор
     if (!$basic) {
         $this->LOGGER->info();
         $this->LOGGER->info('FOLDINGS PROJECT:');
         $this->registerProjectFoldings();
     }
     //Отсортируем фолдинги по идентификаторам
     ksort($this->FOLDINGS);
     //Останавливаем профайлер
     $sec = $this->PROFILER->stop();
     //Логируем
     $this->LOGGER->info();
     $this->LOGGER->info('COLLECTING TIME: {} sec', $sec->getTotalTime());
 }
Example #29
0
 /** Остановка профайлера */
 protected final function profilerStop($save = true)
 {
     PsProfiler::inst('FoldingClass')->stop($save);
 }
Example #30
0
 public function saveToCache($object, $id, $group, $sign = null)
 {
     $cacheId = $this->localCacheKey($id, $group);
     $this->LOGGER->info("Информация по ключу '{$cacheId}' сохранена в кеш");
     $CACHED['sign'] = $sign;
     $CACHED['data'] = $object;
     //Нужно быть аккуратным - в cacheLite мы храним данные и подпись, а в local CACHE только данные
     PsProfiler::inst(__CLASS__)->start('SAVE to cache');
     $this->CACHELITE->save($CACHED, $id, $group);
     PsProfiler::inst(__CLASS__)->stop();
     return array_get_value('data', $this->CACHE->set($cacheId, $CACHED));
 }