/** @return PsProfilerInterface */ private function getProfiler($profilerId) { //Не будем выполнять get_file_name($profilerId), так как нужно вернуть профайлер максимально быстро if ($this->CAHCE->has($profilerId)) { return $this->CAHCE->get($profilerId); } check_condition($profilerId, 'Profiler id cannot be empty.'); if (!$this->enabled) { return $this->CAHCE->set($profilerId, new PsProfilerEmpty($profilerId)); } $di = $this->getProfilerDi($profilerId); $pr = null; //Проверим текущий размер профайлера if ($di->isMaxSize(ConfigIni::profilingMaxFileSize())) { $locked = PsLock::lock(__CLASS__ . "::compressProfiler({$profilerId})", false); if ($locked) { $this->compressProfiler($di); PsLock::unlock(); } else { //Разимер превышен и мы не смогли получить лок для дампа профайлера. Не будем в этот раз вести профайлинг. $pr = new PsProfilerEmpty($profilerId); } } return $this->CAHCE->set($profilerId, $pr ? $pr : new PsProfilerImpl($profilerId)); }
private function doResizeImpl(DirItem $srcDi, $w, $h) { $dim = $w . 'x' . $h; $cacheKey = md5("[{$srcDi}]:[{$dim}]"); if ($this->CAHCE->has($cacheKey)) { return $this->CAHCE->get($cacheKey); } $dstDi = DirManager::autogen("images/{$dim}")->cdToHashFolder(null, null, $cacheKey)->getDirItem(null, $cacheKey, SYSTEM_IMG_TYPE); if ($dstDi->isImg()) { return $this->CAHCE->set($cacheKey, $dstDi); } if (!$srcDi->isImg()) { return $this->CAHCE->set($cacheKey, null); } PsLock::lockMethod(__CLASS__, __FUNCTION__); try { if (!$dstDi->isImg()) { //Картинка не была пересоздана в другом потоке SimpleImage::inst()->load($srcDi)->resizeSmart($w, $h)->save($dstDi, SYSTEM_IMG_TYPE)->close(); } } catch (Exception $ex) { PsLock::unlock(); throw $ex; } PsLock::unlock(); return $this->CAHCE->set($cacheKey, $dstDi); }
/** * Метод возвращает формы слова во всех падежах * * @param type $word * @return array - все склонения слова в виде массива, где под индексом 0 - оригинальное значение */ public function getInflections($word) { $word = PsCheck::notEmptyString(trim($word)); if ($this->CACHE->has($word)) { return $this->CACHE->get($word); } $this->LOGGER->info(); $this->LOGGER->info('> Запрошено склонение для слова [{}]', $word); //$fileName = iconv('UTF-8', 'cp1251', $word); /* * Ищем в БД */ $inflections = InflectsBean::inst()->getInflections($word); if (is_array($inflections)) { $this->LOGGER->info('< Cклонение для [{}] найдено в базе: {}', $word, array_to_string($inflections)); return $this->CACHE->set($word, $inflections); } /* * Загружаем с сервиса */ $inflections = $this->loadInflectionImpl($word); if (is_array($inflections) && count($inflections) == 7) { $this->LOGGER->info('< Склонение для [{}] успешно загружено: {}', $word, array_to_string($inflections)); //Не забудем сохранить полеченное склонение для слова InflectsBean::inst()->saveInflections($inflections); return $this->CACHE->set($word, $inflections); } /* * Загрузить не удалось, возвращаем балванку */ $inflections = array_fill(0, 7, $word); $this->LOGGER->info('< Склонение для [{}] не определено, возвращаем "болванку": {}', $word, array_to_string($inflections)); return $this->CACHE->set($word, $inflections); }
/** * Создание экземпляра класса для сущности фолдинга * @return FoldedClass */ public function getEntityClassInst($ident, $cache = true) { if (!$cache || !$this->INSTS_CACHE->has($ident)) { //Получим элемент - класс $php = $this->getResourceDi($ident, self::RTYPE_PHP); //Проверим, что это - файл check_condition($php->isFile(), 'Не найден класс реализации для сущности ' . $this->getTextDescr($ident)); //Проверим сущность на изменение $this->checkEntityChanged($ident); //Получим FoldedEntity, так как её потом нужно будет передать в конструктор $foldedEntity = $this->getFoldedEntity($ident); //Подключим класс, не будем заставлять трудиться класслоадер require_once $php->getAbsPath(); //Построим название класса на основе идентификатора сущности $baseFoldedClass = 'FoldedClass'; $class = $this->ident2className($ident); check_condition(PsUtil::isInstanceOf($class, $baseFoldedClass), "Класс для сущности {$foldedEntity} не является наследником {$baseFoldedClass}"); //Создаём акземпляр $inst = new $class($foldedEntity); //Отлогируем $this->LOGGER->info("Instance of {$class} created."); FoldedResourcesManager::onEntityAction(FoldedResourcesManager::ACTION_ENTITY_INST_CREATED, $this, $ident); return $cache ? $this->INSTS_CACHE->set($ident, $inst) : $inst; } return $this->INSTS_CACHE->get($ident); }
/** * Основной метод, выполняющий построение контроллера для просмотра постов. * Контроллер может быть отображен в двух случаях: * 1. На странице с просмотром всех постов * 2. На странице с рубрикой * * @return ShowcasesControllerPanel */ private function getScPanel($postType, Rubric $rubric = null) { $key = $postType . '-' . ($rubric ? $rubric->getIdent() : ''); if (!$this->CACHE->has($key)) { $plugins[] = $this->getBaseControllerIdents(); if ($rubric) { $plugins[] = Mappings::RUBRIC_2_SCCONTROLLERS($postType)->getMappedEntitys($rubric->getIdent()); } $insts = $this->getUserAcessibleClassInsts(to_array_expand($plugins)); $ctxt = new ShowcasesControllerCtxt($rubric); $result = array(); /** @var ShowcasesControllerItem */ foreach ($insts as $ident => $inst) { $inst->doProcess($ctxt); $result[$ident] = $inst; } $this->CACHE->set($key, new ShowcasesControllerPanel($result)); } return $this->CACHE->get($key); }
/** @return DirItem */ public final function getUploadedFileDi($uploadId, $userId = null) { if (!$this->CACHE->has($uploadId)) { $this->assertCanUseDb(__FUNCTION__); $this->assertAutonomous('файл не может быть загружен из БД'); $file = UploadsBean::inst()->getFile($this->DBTYPE, $uploadId, $userId); $this->LOGGER->info("File [{$uploadId}] loaded from DB for user [{$userId}] ? {}.", var_export($file, true)); $this->CACHE->set($uploadId, is_array($file) && array_key_exists('name', $file) ? DirItem::inst($file['name']) : null); } return $this->CACHE->get($uploadId); }
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)); }
/** * Метод возвращает DirItem элемента, содержащего картинку-представление формулы. * * @param type $formula - текстовая формула * @param type $createIfNotExists - признак, стоит ли пытаться создавать картинку для формулы * @return DirItem */ public function getImgDi($formula, $createIfNotExists = true) { $formula = TexTools::safeFormula($formula); if ($this->CACHE->has($formula)) { return $this->CACHE->get($formula); } $hash = TexTools::formulaHash($formula); $imgDI = $this->DM->getHashedDirItem(null, $hash, $hash, 'gif'); if ($imgDI->isImg()) { $this->CACHE->set($formula, $imgDI); return $imgDI; } if (!$createIfNotExists) { return null; } //Создаём структуру директорий $imgDI->makePath(); $contents = ''; //Запрашиваем графическое представление $this->PROFILER->start($formula); try { //TODO - делать это локально, чтобы не зависить от стороннего сервиса $handle = fopen('http://latex.codecogs.com/gif.latex?' . rawurlencode($formula), 'r'); while (!feof($handle)) { $contents .= fread($handle, 8192); } fclose($handle); $this->PROFILER->stop(); } catch (Exception $ex) { //Останавливаем профайлер без сохранения $this->PROFILER->stop(false); //Делаем дамп ошибки ExceptionHandler::dumpError($ex, "Tex formula convertation requested for:\n{$formula}"); //Попытаемся подчистить за собой, если мы что-то создали $imgDI->remove(); //Пробрасываем эксепшн throw $ex; } //Сохраняем картинку в файл $imgDI->putToFile($contents); //Сохраним текстовое представление $this->DM->getHashedDirItem(null, $hash, $hash, 'gif.tex')->putToFile($formula); $this->CACHE->set($formula, $imgDI); return $imgDI; }
/** * Метод возвращает сущность фолдинга по заданному коду * * @return FoldedEntity Сущность, соответствующая заданному коду */ public function getFoldedEntityByDbCode($code) { return $this->CACHE->has($code) ? $this->CACHE->get($code) : $this->CACHE->set($code, FoldedStorageInsts::getFoldedEntityByUnique(FoldingBean::inst()->getUniqueByCode($code))); }