Пример #1
0
 /** @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));
 }
Пример #2
0
 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);
 }
Пример #3
0
 /**
  * Метод возвращает формы слова во всех падежах
  * 
  * @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);
 }
Пример #4
0
 /**
  * Создание экземпляра класса для сущности фолдинга
  * @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);
 }
Пример #5
0
 /**
  * Основной метод, выполняющий построение контроллера для просмотра постов.
  * Контроллер может быть отображен в двух случаях: 
  * 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);
 }
Пример #6
0
 /** @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);
 }
Пример #7
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));
 }
Пример #8
0
 /**
  * Метод возвращает 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)));
 }