Небольшое ускорение для InstantCms 1.9

Посетитель
Сообщений: 7
Оффлайн
Простой способ выкинуть лишние запросы со страниц

Наверное многие замечали, что при формирование страницы идет запрос на каждую позицию модуля в шаблоне.
Благодаря данному способу, мы оставляем только один запрос на страницу.
Раньше было
количество позиций в шаблоне = количество запросов на доступность модуля на странице
Сейчас количество позиций в шаблоне = 1
1. Открываем файл coreclassespage.class.php
и вставляем перед последней закрывающейся скобкой
Код PHP:
  1. //////////////////////////////////////////////////////////////////////
  2. public function CountModules_new ($position, $array){
  3. if(!sizeof($array[$position])){ return false; }
  4. return true;
  5. }
  6. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  7. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  8. public function getAllModules(){
  9. $inCore = cmsCore::getInstance();
  10. $inDB = cmsDatabase::getInstance();
  11. //Получаем id пункта меню
  12. $menuid = $inCore->menuId();
  13. // Проверяем позиции
  14. if (!$inCore->isMenuIdStrict()){ $strict_sql = "AND (m.is_strict_bind = 0)"; } else { $strict_sql = ""; }
  15. // Получаем все модули на позицию
  16. $sql = "SELECT *, m.id as mid, m.template as tpl
  17. FROM cms_modules m, cms_modules_bind mb
  18. WHERE m.published = 1 AND
  19. m.id = mb.module_id AND
  20. (mb.menu_id = '$menuid' OR mb.menu_id = 0)
  21. $strict_sql
  22. ORDER BY m.ordering ASC";
  23. $result = $inDB->query($sql);
  24. if(!$inDB->num_rows($result)){ return false; }
  25. while ($mod = $inDB->fetch_assoc($result)){
  26. $mods[$mod['position']][] = $mod;
  27. }//while
  28. return $mods;
  29. }
  30. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  31. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  32. /**
  33.  * Выводит модули для указанной позиции и текущего пункта меню
  34.  * @param string $position
  35.  * @return html
  36.  */
  37. public function printModules_new($position, $mods){
  38. $inCore = cmsCore::getInstance();
  39. $inDB = cmsDatabase::getInstance();
  40. $inUser = cmsUser::getInstance();
  41. global $_CFG;
  42. global $_LANG;
  43. //Получаем id пункта меню
  44. $menuid = $inCore->menuId();
  45. // Проверяем позиции
  46. if (!$position) { return false; }
  47. if ($position=='top' && @$_REQUEST['view']=='search') { return true; }
  48. if(!sizeof($mods[$position])){ return false; }
  49. foreach($mods[$position] as $mod){
  50. // Проверяем права доступа
  51. if (!$inCore->checkContentAccess($mod['access_list'])) { continue; }
  52. $modulefile = PATH.'/modules/'.$mod['content'].'/module.php';
  53. if (!$mod['user']) { cmsCore::loadLanguage('modules/'.$mod['content']); }
  54. if( !$mod['is_external'] ){
  55. //PROCESS FILTERS
  56. $filters = $inCore->getFilters();
  57. if ($filters){
  58. foreach($filters as $id=>$_data){
  59. require_once 'filters/'.$_data['link'].'/filter.php';
  60. $_data['link']($mod['content']);
  61. }
  62. }
  63. $callback = true;
  64. $modulebody = $mod['content'];
  65. }
  66. if( $mod['is_external'] ){
  67. if (file_exists($modulefile)){
  68. //load module file
  69. require_once $modulefile;
  70. //run module and get its output to $modulebody
  71. if ($mod['cache'] && $inCore->isCached('module', $mod['mid'], $mod['cachetime'], $mod['cacheint'])){
  72. $modulebody = $inCore->getCache('module', $mod['mid']);
  73. $callback = true;
  74.  
  75. } else {
  76. $config = $inCore->yamlToArray($mod['config']);
  77. $inCore->cacheModuleConfig($mod['module_id'], $config);
  78. $callback = $mod['content']($mod['module_id']);
  79. $modulebody = ob_get_clean();
  80. if($mod['cache']) { $inCore->saveCache('module', $mod['mid'], $modulebody); }
  81. }
  82. }
  83. }
  84. if ( $callback ){ //if module returns TRUE
  85. $module = array();
  86. $mod['body'] = $modulebody;
  87. $smarty = $inCore->initSmartyModule();
  88. $_CFG['fastcfg'] = isset($_CFG['fastcfg']) ? $_CFG['fastcfg'] : 0;
  89.  
  90. if ($_CFG['fastcfg'] && $inCore->userIsAdmin($inUser->id)){
  91. $smarty->assign('cfglink', '/admin/index.php?view=modules&do=edit&id='.$mod['mid']);
  92. }
  93. $smarty->assign('mod', $mod);
  94. $module_tpl = file_exists($smarty->template_dir.'/'.$mod['tpl']) ? $mod['tpl'] : 'module.tpl';
  95. $smarty->display($module_tpl);
  96. }
  97.  
  98. }//while
  99.  
  100. }
Теперь у нас функции для проверки модулей с позициями
2. Идем в свой шаблон проверяем если нет
Код PHP:
  1. $inPage = cmsPage::getInstance();
то добавляем его в шаблон
3. Собираем общее количество позиций с модулями
Код PHP:
  1. $mods = $inPage->getAllModules();
У нас все модули с позициями собраны
4. делаем проверку на вывод модуля в позицию для примера для позиции top
Код PHP:
  1. $mod_count['top'] = $inPage->CountModules_new('top', $mods);
для видимого эффекта нужно сделать проверку всех позиций для вывода
и пример как делается проверка для этой же позиции
Код PHP:
  1.  
  2. <?php if ($mod_count['top']){ ?>
  3. <div class="clear"></div>
  4. <div id="topwide" class="container_12">
  5. <div class="grid_12" id="topmod"><?php $inPage->printModules_new('mainbottom', $mods); ?></div>
  6. </div>
  7. <?php } ?>
Необходимую операцию необходимо проделать для каждой позиции
Вот и все.
До установки данного хака было 51 запрос после 44 (все зависит от позиций в шаблоне)
---------------------------------------------------------------------------------------
P.S. Поменялись функции
Редактировалось: 1 раз (Последний: 3 июня 2013 в 12:39)
Перейти на форум:
Быстрый ответ
Чтобы писать на форуме, зарегистрируйтесь или авторизуйтесь.