Bladeren bron

#5176 Speed improvements: additional DB caches

Alex Trofimov 1 jaar geleden
bovenliggende
commit
2e9ce46714

+ 5 - 6
inc/classes/BxDolMenuQuery.php

@@ -26,19 +26,18 @@ class BxDolMenuQuery extends BxDolDb
     static public function getMenuObject ($sObject)
     {
         $oDb = BxDolDb::getInstance();
-        $sQuery = $oDb->prepare("SELECT `o`.*, `t`.`template` FROM `sys_objects_menu` AS `o` INNER JOIN `sys_menu_templates` AS `t` ON (`t`.`id` = `o`.`template_id`) WHERE `o`.`object` = ?", $sObject);
-        $aObject = $oDb->getRow($sQuery);
-        if (!$aObject || !is_array($aObject))
-            return false;
 
-        return $aObject;
+        $aMenuObjects = $oDb->fromCache('sys_menu_objects', 'getAllWithKey', "SELECT `o`.*, `t`.`template` FROM `sys_objects_menu` AS `o` INNER JOIN `sys_menu_templates` AS `t` ON (`t`.`id` = `o`.`template_id`)", 'object');
+        if (!$aMenuObjects || !isset($aMenuObjects[$sObject]))
+            return false;
+        return $aMenuObjects[$sObject];
     }
 
     static public function getMenuObjects($bActive = true, $bFromCache = true)
     {
         $oDb = BxDolDb::getInstance();
         $sSql = $oDb->prepare("SELECT `sys_objects_menu`.`title`, `object`, `module`, `uri` FROM `sys_objects_menu` INNER JOIN `sys_modules` ON (`sys_modules`.`name` = `sys_objects_menu`.`module`) WHERE `active` = ? ORDER BY FIELD(`module`, 'system') DESC, `module` ASC, `object` ASC", $bActive ? 1 : 0);
-        return $bFromCache ? $oDb->fromMemory('sys_menus', 'getAll', $sSql) : $oDb->getAll($sSql);
+        return $bFromCache ? $oDb->fromCache('sys_menus', 'getAll', $sSql) : $oDb->getAll($sSql);
     }
 
     static public function getMenuTriggers($sTriggerName)

+ 14 - 9
inc/classes/BxDolPageQuery.php

@@ -35,21 +35,26 @@ class BxDolPageQuery extends BxDolDb
     static public function getPageObjectNameByURI($sURI, $sModule = false, $bSearchRedirects = false)
     {
         $oDb = BxDolDb::getInstance();
-        $a = array('uri' => $sURI);
-        $sQuery = "SELECT `object` FROM `sys_objects_page` WHERE `uri` = :uri";
+        $sObject = false;
         if ($sModule) {
-            $a['module'] = $sModule;
-            $sQuery .= " AND `module` = :module";
+            $sObject = $oDb->getOne("SELECT `object` FROM `sys_objects_page` WHERE `uri` = :uri AND `module` = :module", ['uri' => $sURI, 'module' => $sModule]);
+        } 
+        else {
+            $aUri2Object = $oDb->fromCache('sys_pages_uri_object_map', 'getPairs', "SELECT `uri`, `object` FROM `sys_objects_page`", 'uri', 'object');
+            if (isset($aUri2Object[$sURI]))
+                $sObject = $aUri2Object[$sURI];
         }
-        $sObject = $oDb->getOne($sQuery, $a);
 
         if ($bSearchRedirects && !$sObject) {
-            $sQuery = "SELECT `p`.`object` FROM `sys_objects_page` AS `p` INNER JOIN `sys_seo_uri_rewrites` AS `r` ON (`p`.`uri` = `r`.`uri_orig`) WHERE `r`.`uri_rewrite` = :uri";
             if ($sModule) {
-                $a['module'] = $sModule;
-                $sQuery .= " AND `module` = :module";
+                $sQuery = "SELECT `p`.`object` FROM `sys_objects_page` AS `p` INNER JOIN `sys_seo_uri_rewrites` AS `r` ON (`p`.`uri` = `r`.`uri_orig`) WHERE `r`.`uri_rewrite` = :uri AND `module` = :module";
+                $sObject = $oDb->getOne($sQuery, ['uri' => $sURI, 'module' => $sModule]);
             }
-            $sObject = $oDb->getOne($sQuery, $a);
+            else {
+                $aUriRewrite2Object = $oDb->fromCache('sys_pages_urirewrite_object_map', 'getPairs', "SELECT `r`.`uri_rewrite`, `p`.`object` FROM `sys_objects_page` AS `p` INNER JOIN `sys_seo_uri_rewrites` AS `r` ON (`p`.`uri` = `r`.`uri_orig`)", 'uri_rewrite', 'object');
+                if (isset($aUriRewrite2Object[$sURI]))
+                    $sObject = $aUriRewrite2Object[$sURI];
+            }            
         }
 
         return $sObject;

+ 12 - 2
studio/template/scripts/BxBaseStudioBuilderPage.php

@@ -311,10 +311,12 @@ class BxBaseStudioBuilderPage extends BxDolStudioBuilderPage
             $this->onSavePage($oForm, $aValsToAdd);
 
             $iId = (int)$oForm->insert($aValsToAdd);
-            if($iId != 0)
+            if($iId != 0) {
+                $this->onPageChanged($oForm, $aValsToAdd);
                 return ['eval' => $sJsObject . '.onCreatePage(\'' . $sModule . '\', \'' . $sObject . '\')'];
-            else
+            } else {
                 return ['msg' => _t('_adm_bp_err_page_create')];
+            }
         }
 
         $sContent = BxTemplStudioFunctions::getInstance()->popupBox($this->aHtmlIds['add_popup_id'], _t('_adm_bp_txt_create_popup'), $oTemplate->parseHtmlByName('bp_add_page.html', array(
@@ -350,6 +352,7 @@ class BxBaseStudioBuilderPage extends BxDolStudioBuilderPage
             $this->onSavePage($oForm, $this->aPageRebuild);
 
             if($oForm->update($this->aPageRebuild['id'])) {
+                $this->onPageChanged($oForm, $this->aPageRebuild);
                 $iLevelId = $oForm->getCleanValue('layout_id');
                 if(!empty($iLevelId) && $iLevelId != $this->aPageRebuild['layout_id']) {
                     $aLayoutOld = array();
@@ -399,6 +402,7 @@ class BxBaseStudioBuilderPage extends BxDolStudioBuilderPage
         if($this->oDb->deletePages(array('type' => 'by_object', 'value' => $this->sPage))) {
             $oLangauge->deleteLanguageString($this->aPageRebuild['title_system']);
             $oLangauge->deleteLanguageString($this->aPageRebuild['title']);
+            $this->onPageChanged(null, $this->aPageRebuild);
             return array('eval' => 'window.parent.location.href = "' . sprintf($this->sTypeUrl, $this->sType) . '";');
         }
 
@@ -2079,6 +2083,12 @@ class BxBaseStudioBuilderPage extends BxDolStudioBuilderPage
         }
         return $aBlock;
     }
+
+    protected function onPageChanged($oForm, $aPage)
+    {
+        $this->oDb->cleanCache('sys_pages_uri_object_map');
+        $this->oDb->cleanCache('sys_pages_urirewrite_object_map');
+    }
 }
 
 /** @} */

+ 14 - 4
studio/template/scripts/BxBaseStudioNavigationMenus.php

@@ -56,11 +56,12 @@ class BxBaseStudioNavigationMenus extends BxDolStudioNavigationMenus
             unset($oForm->aInputs['set_title']);
 
             $iId = (int)$oForm->insert(array('object' => $sObject, 'module' => BX_DOL_STUDIO_MODULE_CUSTOM, 'deletable' => 1, 'active' => 1));
-            if($iId != 0)
+            if($iId != 0) {
+                $this->onMenuChanged($sObject);
                 $aRes = array('grid' => $this->getCode(false), 'blink' => $iId);
-            else
+            } else {
                 $aRes = array('msg' => _t('_adm_nav_err_menus_create'));
-
+            }
             echoJson($aRes);
         }
         else {
@@ -106,7 +107,7 @@ class BxBaseStudioNavigationMenus extends BxDolStudioNavigationMenus
             unset($oForm->aInputs['set_title']);
 
             if($oForm->update($aMenu['id']) !== false) {
-                bx_content_cache_del_by_prefix('menu_' . $aMenu['object']); 
+                $this->onMenuChanged($aMenu['object']);
                 $aRes = array('grid' => $this->getCode(false), 'blink' => $aMenu['id']);
             } else {
                 $aRes = array('msg' => _t('_adm_nav_err_menus_edit'));
@@ -145,6 +146,8 @@ class BxBaseStudioNavigationMenus extends BxDolStudioNavigationMenus
 
             BxDolStudioLanguagesUtils::getInstance()->deleteLanguageString($aMenu['title']);
 
+            $this->onMenuChanged($aMenu['object']);            
+
             $aIdsAffected[] = $iId;
             $iAffected++;
         }
@@ -420,6 +423,13 @@ class BxBaseStudioNavigationMenus extends BxDolStudioNavigationMenus
     {
     	return (int)$aRow['deletable'] != 0;
     }
+
+    protected function onMenuChanged($sObject)
+    {
+        bx_content_cache_del_by_prefix('menu_' . $sObject); 
+        $this->oDb->cleanCache('sys_menus');
+        $this->oDb->cleanCache('sys_menu_objects');
+    }
 }
 
 /** @} */