Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

GetProperties работает сишком медленно!

00 голосов
7
Нижеприведенный фрагмент кода исполняется 24-26 секунд.
Есть порядка 80-90 элементов в инфоблоке. Элемент содержит 30 свойств. Одно из свойств множественное (1-4 катринки), остальные - строка.

Время отнимает вызов $obEl->GetProperties(). Как с этим бороться? Это API работают медленно или я что-то не правильно делаю?

Спасибо за ответ.

Код
$dbEl = CIBlockElement::GetList(Array(), Array("IBLOCK_ID"=>3));   
   
   while( $obEl = $dbEl->GetNextElement() )   
   {   
      $props = $obEl->GetProperties();
      
      foreach($props as $name=>$itemArray)
      {
         if( 
         $itemArray["CODE"] == "C_PHOTOS" ||   
         $itemArray["CODE"] == "C_PRICE"  ||
         $itemArray["CODE"] == "C_FULLNAME" 
         )
         {continue;}
         
         if( trim( $itemArray["VALUE"] ) != "" && $itemArray["VALUE"]!= NULL )
         {
            $_ALL_PROPS[ $itemArray["NAME"] ][] = $itemArray["VALUE"];
         }
      }
      
   }
спросил 20 Авг, 13 от EverleSS (200 баллов)

7 Ответы

00 голосов
Переведите инфоблок в режим 2.0 Делается это на странице свойст инфоблока.
ответил 20 Авг, 13 от Pomnep (13,960 баллов)
00 голосов
Переход к инфоблоку 2.0 это крайний случай :)
Попробуйте задавать свойства в гетлисте, тогда будут использоваться джойны свойств вместо страшного каскада запросов в цикле:
Код
$rs = CIBlockElement::GetList(array(),array('IBLOCK_ID'=>3),false,false,array('*','PROPERTY_C_PHOTOS','PROPERTY_C_PRICE'))
while ($ar=$rs->GetNext()) var_dump($ar);
Более того, перечень свойств (айдишники) можно получить заранее и потом передать нужные вместе с '*' в 5 параметр гетлиста как строки вида "PROPERTY_№".
ответил 29 Окт, 13 от Eddie (2,060 баллов)
00 голосов
У товарища 30 свойств в инфоблоке. Так что инфоблоки 2.0 - это не крайний случай, а суровая необходимость.
Затем. Чем ему поможет Ваш код:
Цитата
Дмитрий Якинцев пишет:
Код
$rs = CIBlockElement::GetList(array(),array('IBLOCK_ID'=>3),false,false,array('*','PROPERTY_C_PHOTOS','PROPERTY_C_PRICE'))

если у него в примере эти свойства как раз игнорируются:
Цитата
Modo пишет:
Код
if( 
         $itemArray["CODE"] == "C_PHOTOS" ||   
         $itemArray["CODE"] == "C_PRICE"  || 
         $itemArray["CODE"] == "C_FULLNAME" 
         ) 
         {continue;}

? Ему как раз все остальные нужны, которые в Вашей выборке будут отсутствовать. Не говоря уж о том, что если среди этих свойств есть множественные, получит товарищ дублирование записей в выборке.
ответил 02 Фев, 14 от Pomnep (13,960 баллов)
00 голосов
Цитата
Евгений Жуков пишет:
Не говоря уж о том, что если среди этих свойств есть множественные, получит товарищ дублирование записей в выборке.


:)

1. Переход на инфоблоки 2 действительно в вашем случае поможет ускориться и не надо их бояться.
2. Пользоваться GetProperties как правило не желательно, исполльзуйте GetList с указанием в последнем массиве только того что вы хотите выбрать
ответил 22 Май, 14 от Dakost (580 баллов)
00 голосов
Извините товарищи - я ввел вас в заблуждение.
Забыл, что ранее преобразовал инфоблок в 2.0.
Сейчас перенес свойства обратно в общую таблицу - результат: -20сек.

Всем большое спасибо за ответы!
ответил 18 Сен, 14 от EverleSS (200 баллов)
00 голосов
Modo, попробуйте гетлист с перечнем свойств, возможно еще несколько секунд выиграете.
Евгений Жуков, это пример запроса типа GetList, очевидно ведь, что нужные свойства надо получать заранее и передавать в запрос.
ответил 23 Янв, 15 от Eddie (2,060 баллов)
00 голосов
Цитата
Дмитрий Якинцев пишет:
Евгений Жуков, это пример запроса типа GetList, очевидно ведь, что нужные свойства надо получать заранее и передавать в запрос.

Вы в мой комментарий вчитались? Повторяю, Вашим запросом товарищ получит те свойства, что ему НЕ НУЖНЫ, судя по приведенному им исходнику.
ответил 07 Май, 15 от Pomnep (13,960 баллов)

Похожие вопросы

0 голосов
3 ответов
спросил 31 Март, 14 от Eoling (140 баллов)
0 голосов
2 ответов
спросил 08 Дек, 13 от Snezhka (2,240 баллов)
0 голосов
5 ответов
спросил 21 Авг, 13 от Exet (380 баллов)
0 голосов
4 ответов
0 голосов
1 ответ