Хлебные крошки

#
Хлебные крошки
Возникла серьезная проблема с хлебными крошками.

При достаточно большой структуре вызов хлебных крошек занимает много времени, только они одни дают 100 с лишним запросов к базе и замедляют время загрузки на 0.5-1.5 сек.

Можно ли как то оптимизировать его? сейчас это можно сказать перелопачивание всей структуры, много лишней работы. Можно ли как то изменить метод?

А то так только кэширование может спасти.
Модератор
#
Re: Хлебные крошки
h4mpy,
Код хлебных крошек старый или новый? На демо-сайте есть новый, весьма оптимальный, код.
Чтобы крошки давали 100 запросов мне неизвестно, присылайте запрос в поддержку, будем смотреть.
Система обновлена до последней версии?
#
Re: Хлебные крошки
проблема локализовалась, просто для узлов структуры создано много доп. св-в, и все они передаются в xml при генерации.
и в меню и в хлебных крошках.
Предложение (или вопрос): можно ли для метода ShowStructure сделать какой-то параметр, напр. compact_mode? и дать ему false или true, или даже 3 значения. Если ставим 0, то в xml передаются все параметры, если 1, то только основные свойства, если 2, то заголовки. Для меню почти на всех сайтах нужен был бы 2, сразу бы сняло большую часть нагрузки.
И этот параметр можно было бы сделать для других show методов. Дало бы большой простор для оптимизации. Для вызовов всяких кратких новостей, списков фоток, подошел бы "1", в некоторых тип. дин. подошел бы "1" для  списков элементов. Потому что сейчас почти все зарастает доп. св-вами..генерируются xml-монстры.
Помогите.
Модератор
#
Re: Хлебные крошки
Добавлен параметр xml_show_structure_property - разрешает указание в XML значений свойств узлов структуры, по умолчанию true.
Использовать можно в версии 5.4.2, обновление ожидаем сегодня.
#
Re: Хлебные крошки
Здравствуйте.

Для генерации крошек использую следующий код:
<?php
// Вывод строки навигации

$InformationSystem = & singleton('InformationSystem');

// Определяем информацию об информационной системе, связанной с текущим узлом
if (!isset($InformationSystem_id)) {
   $InformationSystem_id = $InformationSystem->GetInformationSystemByStructureId(CURRENT_STRUCTURE_ID);
}

$property = array();

$external_propertys = array();

// Если с узлом структуры связана ИС
if ($InformationSystem_id)
{
   $result = $InformationSystem->GetInformationFromPath($InformationSystem_id, '', false);

   // определяем id информационного элемента
   if ($result['item'])
   {
      $item_id = $InformationSystem->GetIdInformationItem($result['item'], $result['group'], $InformationSystem_id);
   }
   else
   {
      $item_id = false;
   }

   if (is_array($result) && ($item_id != 0 || $result['group'] > 0))
   {
      // Передаем во внешние параметры ID элемента и группы
      $external_propertys['item'] = $item_id;
      $external_propertys['group'] = $result['group'];
   }
   
   $property['show_groups'] = true;
   $property['show_items'] = true;
   $property['xml_show_structure_property'] = false;
   
   // Данные для хлебных крошек заполняем только для текущей ИС
   $property['show_information_systems'][] = $InformationSystem_id;
}

$structure = & singleton('Structure');
$structure->ShowStructure(false, 'ХлебныеКрошки', $property, $external_propertys);
?>


Он пожирает более 64мб памяти, пришлось memory_limit поставить 128мб, иначе выдаётся ошибка:
Fatal error:  Allowed memory size of 67108864 bytes exhausted (tried to allocate 286240 bytes) in /..../shop-host/modules/Structure/Structure.class.php on line 1945

Кроме того страница с хлебными крошками генерица 5с, без них таже страница генерица за секунду.

ИС по которой идёт генерация состоит из 173 групп/подгрупп и около 15тыс элементов.

Размер XML для крошек около 5мб.

Можно ли как-то оптимизировать? Я так понимаю надо из xml отсечь лишнюю информацию?
Модератор
#
Re: Хлебные крошки
Можно, пример:
<?php
      // Вывод строки навигации
      $InformationSystem = & singleton('InformationSystem');

      // Определяем информацию об информационной системе, связанной с текущим узлом
      $InformationSystem_id = $InformationSystem->GetInformationSystemByStructureId(CURRENT_STRUCTURE_ID);

      $param = array();

      // Доп. св-ва для структуры отключаем
      $param['xml_show_structure_property'] = false;

      $external_propertys = array();

      // Если с узлом структуры связана ИС
      if ($InformationSystem_id)
      {
         $result = $InformationSystem->GetInformationFromPath($InformationSystem_id, '', false);

         // определяем id информационного элемента
         if ($result['item'])
         {
            $item_id = $InformationSystem->GetIdInformationItem($result['item'], $result['group'], $InformationSystem_id);

            if ($item_id != 0)
            {
               $external_propertys['item'] = $item_id;

               $param['show_groups'] = true;
               $param['show_items'] = array($item_id);
            }
         }
         else
         {
            $item_id = false;
         }

         if (is_array($result) && $result['group'] > 0)
         {
            // Передаем во внешние параметры ID элемента и группы
            $external_propertys['group'] = $result['group'];
            $param['show_groups'] = true;
         }

         // Данные для хлебных крошек заполняем только для текущей ИС
         $param['show_information_systems'][] = $InformationSystem_id;
      }
      elseif (class_exists('shop'))
      {
         $shop = & singleton('shop');

         // Определяем информацию о магазине, связанным с магазином
         $shop_row = $shop->GetShopWhithStructureId(CURRENT_STRUCTURE_ID, CURRENT_SITE);

         if ($shop_row)
         {
            $result = $shop->GetItemPath($shop_row['shop_shops_id'], '', false);

            // определяем id информационного элемента
            if ($result['item'])
            {
               $item_id = $result['item'];

               if ($item_id != 0)
               {
                  $external_propertys['item'] = $item_id;

                  $param['show_shop_groups'] = true;
                  $param['show_shop_items'] = array($item_id);
               }
            }
            else
            {
               $item_id = false;
            }

            if (is_array($result) && $result['group'] > 0)
            {
               // Передаем во внешние параметры ID элемента и группы

               $external_propertys['group'] = $result['group'];

               $param['show_shop_groups'] = true;
            }
         }
      }

      $structure = & singleton('Structure');
      $structure->ShowStructure(false, 'ХлебныеКрошки', $param, $external_propertys);

      // END Хлебные крошки
      ?>
#
Re: Хлебные крошки
спасибо
$param['show_items'] = array($item_id);
решает.
Модератор
#
Re: Хлебные крошки
Пожалуйста
Авторизация