/** * Метод отправляет письмо пользователю * * @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; } }
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; }
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__); }
/** @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; } }
/** * Основной метод получения экземпляра. * * @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]; }
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; }
/** * Метод валидирует все доступные 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; }
/** * Загружает список всех изменений, произошедших в базе. */ 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; }
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(); }
/** * Метод возвращает карту: сущность фолдинга=>массив сущностей, от которых она зависит. * При этом зависимость сущности от фолдинга будет только в том случае, если сама сущность сохранила об этом информацию в кеше. * Не сохраняем построенную карту в переменную класса, так как карта может измениться. */ 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; }
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(); }
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; }
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); }
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(); }
/** * Конструктор. В нём мы составим полный список директорий, в которых потом будет производиться поиск * * @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}"); } }
/** * В конструкторе зарегистрируем все страницы */ 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()); }
/** * КОНСТРУКТОР */ 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} не имеет подтипа."); } } }
protected function __construct() { $this->LOGGER = PsLogger::inst(__CLASS__); $this->PROFILER = PsProfiler::inst(__CLASS__); $this->CACHE = SimpleDataCache::inst(); $this->DM = DirManager::autoNoDel(DirManager::DIR_FORMULES); }
/** * В конструкторе пробежимся по всем хранилищам и соберём все фолдинги */ 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()); } }
/** * Переопределим конструктор */ 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(); }
/** @return PsProfiler */ public static function controller() { return isset(self::$inst) ? self::$inst : (self::$inst = new PsProfiler()); }
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(); }
/** * Метод вызывается для выполнения периодических задач 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; }
protected function __construct() { PsUtil::assertClassHasDifferentConstValues(__CLASS__, 'TYPE_'); $this->LOGGER = PsLogger::inst(__CLASS__); $this->PROFILER = PsProfiler::inst(__CLASS__); $this->CACHE = new SimpleDataCache(); }
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()); }
/** Остановка профайлера */ protected final function profilerStop($save = true) { PsProfiler::inst('FoldingClass')->stop($save); }
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)); }