예제 #1
0
파일: NewsBlock.php 프로젝트: ilivanoff/www
 public function getBlockHtml()
 {
     $block = PSCache::NEWS()->getFromCache($this->blockDate);
     if (!$block) {
         $block = PSSmarty::template('news/date_news.tpl', array('block' => $this))->fetch();
         PSCache::NEWS()->saveToCache($block, $this->blockDate);
     }
     return $block;
 }
예제 #2
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;
 }
예제 #3
0
 protected function __construct()
 {
     //Извлекаем все изменённые сущности БД
     $CHANGED = DbBean::inst()->getChangedEntitys();
     if (empty($CHANGED)) {
         return;
         //---
     }
     $LOGGER = PsLogger::inst(__CLASS__);
     $LOGGER->info('Изменённые сущности БД: ' . print_r($CHANGED, true));
     foreach ($CHANGED as $chEntity) {
         $type = $chEntity['v_type'];
         $entity = $chEntity['v_entity'];
         $TypeEntity = "{$type} {$entity}";
         switch ($type) {
             /*
              * 1. Проверим изменённые сущности фолдинга
              */
             case DbBean::CHANGE_FOLD_ENT:
                 $fentity = Handlers::getInstance()->getFoldedEntityByUnique($entity, false);
                 if ($fentity) {
                     $LOGGER->info('[{}] -> Сущность фолдинга [{}]', $TypeEntity, $fentity->getUnique());
                     FoldedResourcesManager::onEntityAction(FoldedResourcesManager::ACTION_ENTITY_CHANGED_DB, $fentity->getFolding(), $fentity->getIdent());
                     $fentity->onEntityChanged();
                 }
                 break;
                 /*
                  * 2. Проверим изменённые таблицы/представления
                  */
             /*
              * 2. Проверим изменённые таблицы/представления
              */
             case DbBean::CHANGE_TABLE:
             case DbBean::CHANGE_VIEW:
                 /* @var $folding FoldedResources */
                 foreach (FoldedResourcesManager::inst()->getTableOrViewFoldings($entity) as $folding) {
                     $LOGGER->info('[{}] -> Фолдинг [{}]', $TypeEntity, $folding->getUnique());
                     $folding->onFoldingChanged();
                 }
                 foreach (PSCache::inst()->onDbEntityChanged($entity) as $cacheGr) {
                     $LOGGER->info('[{}] -> Группа кеширования [{}]', $TypeEntity, $cacheGr);
                 }
                 break;
         }
     }
 }
예제 #4
0
 protected function executeImpl(ArrayAdapter $params)
 {
     $id = $params->str('id');
     $type = $params->str('type');
     $action = $params->str('action');
     switch ($action) {
         case 'ccache':
             PSCache::inst()->clean();
             break;
         case 'toggledev':
             PsGlobals::inst()->getProp('PS_PRODUCTION')->setValue(!PS_PRODUCTION);
             PsGlobals::inst()->save2file();
             break;
         default:
             return 'Unknown action';
     }
     return new AjaxSuccess();
 }
예제 #5
0
 public function __destruct()
 {
     parent::__destruct();
     if (!$this->_isConnected) {
         return false;
     }
     $this->_memcacheObj->set('keysCached', $this->_keysCached, 0, 0);
     $this->_memcacheObj->set('tablesCached', $this->_tablesCached, 0, 0);
     $this->close();
 }
예제 #6
0
 /**
  * Подписью кеша служит кол-во ячеек, принадлежащих пользователям.
  */
 private function getCachable($key)
 {
     $sign = $this->getOwnedCellsCnt();
     $DATA = PSCache::MOSAIC()->getFromCache($this->id, PsUtil::getClassConsts(__CLASS__, 'CACHABLE_'), $sign);
     if (!is_array($DATA)) {
         $DATA = array();
         $ownedCells = $this->BEAN->getOwnedCells($this->id);
         $sign = count($ownedCells);
         //Честно посчитаем подпись по кол-ву ячеек, с которым была построена карта
         $DATA[self::CACHABLE_AREAS] = MosaicImageCellsCompositor::area($ownedCells, $this->cellWidth, $this->cellHeight);
         $DATA[self::CACHABLE_STATISTIC] = $this->BEAN->getStatictic($this->id);
         PSCache::MOSAIC()->saveToCache($DATA, $this->id, $sign);
     }
     return array_get_value($key, $DATA);
 }
예제 #7
0
파일: PsGallery.php 프로젝트: ilivanoff/www
 /**
  * Метод собирает всю необходимую информацию о галерее и кеширует её для быстрого доступа.
  */
 private function getSnapshot()
 {
     $DATA = PSCache::GALLERY()->getFromCache($this->gallery, PsUtil::getClassConsts($this, 'PARAM_'));
     if (is_array($DATA)) {
         return $DATA;
         //---
     }
     $DATA = array();
     /*
      * Информация о галерее (из базы)
      */
     $galleryInfo = GalleryBean::inst()->getGalleryInfo($this->gallery);
     //name
     $gallName = $galleryInfo ? trim($galleryInfo['v_name']) : '';
     $gallName = $gallName ? $gallName : 'Галерея';
     /*
      * Картинки, входящие в галерею (те, для которых есть запись в БД и b_show=1).
      * Мы также сразу отсеим те картинки, для которых нет файла на файловой системе,
      * чтобы потом клиент не делал лишний запрос на наш сервер.
      */
     $galleryImages = GalleryBean::inst()->getGalleryItems($this->gallery, false, $this->getDirectoryImgNames());
     //Проведём фетчинг необходимых представлений галереи
     $SmartyParams['id'] = $this->gallery;
     $SmartyParams['name'] = $gallName;
     $SmartyParams['images'] = $galleryImages;
     //.box_images - блок картинок, который будет преобразован в галерею с помощью js.
     $imagesHtml = PSSmarty::template('mmedia/gallery/box_images.tpl', $SmartyParams)->fetch();
     $imagesHtml = normalize_string($imagesHtml);
     //.as_list - для отображения списка картинок в popup окне
     $asListHtml = PSSmarty::template('mmedia/gallery/as_list.tpl', $SmartyParams)->fetch();
     $asListHtml = normalize_string($asListHtml);
     //Все сложим в файл и сохраним в кеш
     $DATA[self::PARAM_CNT] = count($galleryImages);
     $DATA[self::PARAM_NAME] = $gallName;
     $DATA[self::PARAM_ASLIST] = $asListHtml;
     $DATA[self::PARAM_BOXIMGS] = $imagesHtml;
     return PSCache::GALLERY()->saveToCache($DATA, $this->gallery);
 }
예제 #8
0
 public function clean()
 {
     PSCache::inst()->cleanCache($this->group);
 }
예제 #9
0
 protected function loadIdentsRight($mident, array $params, \MappingSource $srcLeft, $lident)
 {
     return PSCache::getCacheGroups();
 }
예제 #10
0
 public function __destruct()
 {
     parent::__destruct();
     file_put_contents(_PS_CACHEFS_DIRECTORY_ . 'keysCached', serialize($this->_keysCached));
     file_put_contents(_PS_CACHEFS_DIRECTORY_ . 'tablesCached', serialize($this->_tablesCached));
 }
예제 #11
0
 public final function onFoldingChanged()
 {
     if ($this->foldingChangeNotified) {
         return;
         //---
     }
     $this->foldingChangeNotified = true;
     $this->LOGGER->info('Вызван метод onFoldingChanged.');
     FoldedResourcesManager::onEntityAction(FoldedResourcesManager::ACTION_FOLDING_ONCE_CHENGED, $this);
     PSCache::inst()->onFoldingChanged($this);
 }
예제 #12
0
 /**
 * Распечатывает текущее состояние дерева зависимости в лог.
 * При этом в дереве отмечаются всегда только полностью проверенные сущности.
 * Если, например, группа зависит от таблиц БД, которые были провалидированы, но при этом
 * сама группа отмечена, как валидная, то мы увидим подобную картину:
 * 
  +GALLERY:
  |	Сущности базы:
  |		ps_gallery
  |		ps_gallery_images
 */
 private function logTrees($caption, $doLog = true)
 {
     if (!$doLog || !$this->LOGGER->isEnabled()) {
         return;
         //---
     }
     $this->LOGGER->infoBox($caption);
     $GROUPS = PSCache::getCacheGroups();
     $hasPrintedGroups = false;
     foreach ($GROUPS as $group) {
         $isGroupPrinted = false;
         foreach ($this->TREE_DEP as $type => $groups2entitys) {
             if (!array_key_exists($group, $groups2entitys)) {
                 continue;
             }
             $valGr = !$this->isGroupValidatable($group);
             $valType = !$valGr && !$this->isTypeValidateble($type);
             if ($hasPrintedGroups && !$isGroupPrinted) {
                 $this->LOGGER->info();
             }
             if (!$isGroupPrinted) {
                 $isGroupPrinted = true;
                 $hasPrintedGroups = true;
                 $this->LOGGER->info("\t" . ($valGr ? '+' : '|') . $group . ':');
             } else {
                 $this->LOGGER->info("\t|");
             }
             $this->LOGGER->info("\t" . ($valType ? '+' : '|') . "\t{$type}:");
             foreach ($groups2entitys[$group] as $child) {
                 $varChild = !$valGr && !$valType && !in_array($child, $this->getChildsForValidate($type, $group));
                 $this->LOGGER->info("\t" . ($varChild ? '+' : '|') . "\t\t{$child}");
             }
         }
     }
     $this->LOGGER->info(pad_left('', ps_strlen($caption) + 4, '+'));
     $this->LOGGER->info();
 }
예제 #13
0
파일: posts.php 프로젝트: ilivanoff/www
 protected function cacheGroup()
 {
     return PSCache::POSTS();
 }
예제 #14
0
 /**
  * Плагины, использованные в постах
  */
 public function getSnapshot()
 {
     $SNAPSOT = PSCache::POPUPS()->getFromCache('POPUP_PAGES_SNAPSOT', PsUtil::getClassConsts(__CLASS__, 'CACHABLE_'));
     if (!is_array($SNAPSOT)) {
         $this->LOGGER->info('Building plugins SNAPSHOT...');
         //Сначала соберём все плагины, использованные в постах
         $USED = array();
         /* @var $pp PostsProcessor */
         foreach (Handlers::getInstance()->getPostsProcessors() as $pp) {
             $pp->preloadAllPostsContent();
             /* @var $post Post */
             foreach ($pp->getPosts() as $post) {
                 $plugins = $pp->getPostContentProvider($post->getId())->getPostParams()->getUsedPlugins();
                 if (empty($plugins)) {
                     //В посте не используются плагины
                     continue;
                 }
                 $this->LOGGER->info('Plugins [{}] used in post [{}].', implode(',', $plugins), IdHelper::ident($post));
                 $USED = array_merge($USED, $plugins);
             }
         }
         $USED = array_unique($USED);
         $this->LOGGER->info('Full list of used plugins: [{}].', implode(',', $USED));
         //Соберём все видимые попап-страницы и плагины
         $ENTITYS = array();
         foreach (array($this->getVisibleClassInsts(), PluginsManager::inst()->getVisibleClassInsts()) as $popups) {
             foreach ($popups as $ident => $popup) {
                 $visType = $popup->getPopupVisibility();
                 $take = PopupVis::isAllwaysVisible($visType) || $visType == PopupVis::BYPOST && in_array($ident, $USED);
                 if ($take) {
                     $ENTITYS[] = $popup;
                 }
             }
         }
         //Отсортируем собранные сущности по названию
         usort($ENTITYS, function ($e1, $e2) {
             $str1 = $e1 instanceof BasePopupPage ? $e1->getTitle() : $e1->getName();
             $str2 = $e2 instanceof BasePopupPage ? $e2->getTitle() : $e2->getName();
             return strcasecmp($str1, $str2);
         });
         $VISIBLE = array();
         $DEFAULT = array();
         foreach ($ENTITYS as $entity) {
             $visType = $entity->getPopupVisibility();
             if ($entity instanceof BasePopupPage) {
                 $type = self::TYPE_PAGE;
                 $ident = $entity->getIdent();
             }
             if ($entity instanceof BasePlugin) {
                 $type = self::TYPE_PLUGIN;
                 $ident = $entity->getIdent();
             }
             $VISIBLE[$type . '_' . $ident] = array('type' => $type, 'ident' => $ident);
             if ($visType == PopupVis::TRUE_DEFAULT) {
                 $DEFAULT[$type . '_' . $ident] = array('type' => $type, 'ident' => $ident);
             }
         }
         $SNAPSOT = array(self::CACHABLE_VISIBLE => $VISIBLE, self::CACHABLE_DEFAULT => $DEFAULT);
         $SNAPSOT = PSCache::POPUPS()->saveToCache($SNAPSOT, 'POPUP_PAGES_SNAPSOT');
     }
     return $SNAPSOT;
 }
예제 #15
0
$a = array('a' => array('x' => 1, 'y' => 2));
$key = 'M';
$group = 'default';
$group2 = 'default2';
PSCache::inst()->saveToCache($a, $key, $group, 'xxx');
PSCache::inst()->saveToCache(array('a' => 1), '$key', '$group', 'xxx1');
die;
echo TestUtils::testProductivity(function () {
    PSCache::inst()->getFromCache('$key', '$group', null, 'xxx1');
});
print_r(PSCache::inst()->getFromCache($key, $group, array('a'), 'xxx1'));
die;
print_r(PSCache::inst()->saveToCache($a, $key, $group));
print_r(PSCache::inst()->getFromCache($key, $group));
PSCache::inst()->removeFromCache($key, $group);
print_r(PSCache::inst()->getFromCache($key, $group));
die;
/*

 echo PsConnectionPool::params();
*/
//print_r(PSDB::getRec('select * from blog_post where id_post=1'));
//print_r(InflectsManager::inst()->getInflections('корыто'));
//print_r(PsMathRebusSolver::solve('a+df=1aa'));
//print_r(PsTable::inst('users')->getColumns());
//echo TexImager::inst()->getImgDi('\alpha');
//echo TexImager::inst()->getImgDi('\sqrt{4}=2');
//$sprite = CssSprite::inst(DirItem::inst('ps-content/sprites/ico'));
//echo $sprite->getSpriteSpan('calendar');
//print_r(ConfigIni::cronProcesses());
//$tpl = PSSmarty::template(DirItem::inst(__DIR__, 'mytpl', PsConst::EXT_TPL));
예제 #16
0
 /**
  * Очистка кеша
  */
 private function cleanFoldedCache($ident)
 {
     if ($this->isCanUseCache($ident)) {
         PSCache::inst()->cleanCache($this->cacheGroup($ident));
     }
 }
예제 #17
0
 /**
  * Метод строит композицию временной шкалы.
  * Построенная композиция будет автоматически сохранена в кеш.
  * Методы были разделены осознанно, возможно нам нужно будет получить именно композицию.
  * 
  * @return TimeLineItemsComposite
  */
 public final function getTimeLineComposition(ArrayAdapter $params)
 {
     $cacheKey = $this->prepareBuildCompositionParamsAndGetCahceKey($params);
     $this->LOGGER->info('Строим хронологическую шкалу, данные: ' . $cacheKey);
     $this->profilerStart(__FUNCTION__);
     try {
         $composition = $this->buildComposition($params);
         check_condition($composition instanceof TimeLineItemsComposite, 'Некорректно построена хронологическая шкала');
         $this->profilerStop();
         $this->LOGGER->info('Шкала успешно построена');
         PSCache::TIMELINES()->saveToCache($composition->getTimeLineJson(), $cacheKey);
         $this->LOGGER->info('Шкала сохранена в кеш под ключём: ' . $cacheKey);
         return $composition;
     } catch (Exception $ex) {
         $this->profilerStop(false);
         $this->LOGGER->info('Ошибка построения шкалы: ' . $ex->getMessage());
         throw $ex;
     }
 }
예제 #18
0
 protected function q($query, $use_cache = 1)
 {
     global $webservice_call;
     $this->_result = false;
     if ($this->_link) {
         $result = mysql_query($query, $this->_link);
         $this->_lastQuery = $query;
         if ($webservice_call) {
             $this->displayMySQLError($query);
         }
         if ($use_cache and _PS_CACHE_ENABLED_) {
             PSCache::getInstance()->deleteQuery($query);
         }
         return $result;
     }
     return false;
 }