Небольшое ускорение для инстант

+38
2.71K
Простой способ выкинуть лишние запросы со страниц

Наверное многие замечали, что при формирование страницы идет запрос на каждую позицию модуля в шаблоне.
Благодаря данному способу, мы оставляем только один запрос на страницу.
Раньше было
количество позиций в шаблоне = количество запросов на доступность модуля на странице
Сейчас количество позиций в шаблоне = 1
1. Открываем файл \core\classes\page.class.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. Идем в свой шаблон проверяем если нет
  1. $inPage = cmsPage::getInstance();
то добавляем его в шаблон
3. Собираем общее количество позиций с модулми
  1. $mods = $inPage->getAllModules();
У нас все модули с позициями собраны
4. делаем проверку на вывод модуля в позицию для примера для позиции top
  1. $mod_count['top'] = $inPage->CountModules_new('top', $mods);
для видимого эффекта нужно сделать проверку всех позиций для вывода
и пример как делается проверка для этой же позиции
  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 } ?>
  8.  
Необходимую операцию необходимо проделать для каждой позиции
Вот и все.
До установки данного хака было 51 запрос после 44 (все зависит от позиций в шаблоне)
---------------------------------------------------------------------------------------
P.S. Поменялись функции
0
lokanaft lokanaft 11 лет назад #
+
Но он ускорился бы намного лучше, если бы был всего один запрос для получения всех модулей для этой страницы и текущей группы пользователя =)
+6
Fuze Fuze 11 лет назад #
в 1.10.1 подумаем как сделать лучше.
0
Def Def 11 лет назад #
а что и такая ожидается и как скоро?)
+5
Fuze Fuze 11 лет назад #
конечно ожидается.

я надеюсь до НГ.
+1
lokanaft lokanaft 11 лет назад #
Вот блин, а говорили это последняя, терь думай, когда окончательно всё можно будет распетрушить, не боясь обновлений laugh
+3
Fuze Fuze 11 лет назад #
последняя, функционал наращиваться не будет, только безопасность, багфикс и ускорение.
0
Kreator Kreator 11 лет назад #
Такого наверно не может быть в принципе ... тож хотелось сделать что-то под себя ... но вспомнив что может быть какое нибудь обновление все планы уходят в архив ... и после очередного обновления все повторяется.
0
Kreator Kreator 11 лет назад #
это был камент к lokanaft
0
Fuze Fuze 11 лет назад #
дальнейшие обновления будут простые. Шаблоны если у будут затрагиваться, то практически не заметно, хотя не уверен, что вообще будем править их. Так что не стоит бояться.
0
alexbabo alexbabo 11 лет назад #
то есть кто ждет обновления до 1.10.1 не стоит пока устанавливать это дополнение для 1.10?Видимо с 1.10.1 будет не совместимо
0
SLOT 800 SLOT 800 11 лет назад #
В 1.10.1 это уже исправлено?
0
forlord forlord 11 лет назад #
я думаю не все переходить будут на 1,10. Этот вариант подойдет для любой версии
+5
forlord forlord 11 лет назад #
Обновлено, теперь запросов еще меньше!!!
0
forlord forlord 11 лет назад #
Очень много людей просят объяснить, что поменялось.
Пробую объяснить более подробно
Что было:
чтоб вывести позицию в шаблоне у нас два действие
1)проверяем если что-то там выводить
2)проверяем на доступность модулей в позицию
к примеру у нас в шаблоне 7 позиций для вывода модулей 7*2 = 14 запросов к базе
Сейчас все тоже самое только 1 запросом
Вот такая разница. Думаю всем смог понятно объяснить
+1
RIM5 RIM5 11 лет назад #
Очень полезно ускорять и оптимизировать код! Спасибо большое! smile
Буду ставить.
0
lokanaft lokanaft 11 лет назад #
Права доступа проверяются поздно, то есть считаются все модули для этой страницы, а не только для группы "Гость" например.
0
Aleksandr Aleksandr 11 лет назад #
Данное ускорение только на 1.10 работает ??
НА 1.9 можно пробовать ?
0
forlord forlord 11 лет назад #
работает
0
Aleksandr Aleksandr 11 лет назад #
не совсем понятно последний пункт как в шаблоне что писать ((((
0
maia maia 9 лет назад #
Тоже не поняла (( А очень хотелось бы. Можно подробнее?

Еще от автора

Новогодняя распродажа
Фотогалерея для сайта - 2000р http://demo.photoinstant.ru/ Автомобильная доска - 2000р http://auto.forlord.ru/ Подарки для друга - 800р http://demo.
Новая фотогалерея для сайта
Вот и пришло время показать, к чему пришла фотогалерея
Фотогалерея
Дорогие друзья, рад предоставить на Ваш суд очередную фотогалерею для 1.10+ Что же умеет фотогалерея
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.