[B]Задача[/B]: реализовать загрузку на сайт в каталог данных из csv файла + прикрепление картинок в публичной части, то есть для клиентов, которым не дан доступ в админку.
На данный момент сама по себе задача решена:
1) Файлы csv + картинки загружаются в 1 zip архиве
2) Архив распаковывается
3) Сначала обрабатываются построчно данные из csv файлов
4) Наконец подгружаются кратинки к элементам
То есть все работает.
[B]Проблема[/B]: в том, что при всем при этом уж больно много запросов возникает даже для небольших файлов с данными.
[B]Собственно вопрос[/B]: кто какие способы оптимизации предложит?
На данный момент используется:
1) Для добавления нового элемента ($Element содержит сразу и PROPERTY_VALUES):
[CODE]$el = new CIBlockElement;
$ID = $el->Add($Element);[/CODE]2) Для обновления элемента:
Сначала для обновления свойств
[CODE]foreach($ElementProps as $PropCode=>$Value){
CIBlockElement::SetPropertyValues($ElementID, $IBlock["ID"], $Value, $PropCode);
}[/CODE]этот код вызванный для 9 элементов (по 4-5 свойств у каждого) генерирует ~136 запросов.
Затем для обновления самого элемента (и поискового индекса)
[CODE]$el = new CIBlockElement;
$el->Update($ElementID, $Element);[/CODE]этот код вызванный для 9 элементов ($Element содержит только NAME, ACTIVE, DATE_ACTIVE_TO) генерирует ~535 запросов (! вообще ужас). На сколько я понял, в основном запросы тратятся на обновление поискового индекса... Так как, если его не обновлять (bUpdateSearch=true), количество запросов падает сразу да нескольких штук. Но ведь обновить его нужно, если элемент изменен.
3) Для подгрузки картинок (отдельно для каждого элемента):
[CODE]CIBlockElement::SetPropertyValues($ElementID, $IBlock["ID"], $arPicts, "IMAGE_MAIN");[/CODE]этот код вызванный 5 раз (5 элементов) для загрузки 9 картинок (по 2-3 картинки у некоторых) генерирует ~99 запросов.
Итого около [B]800[/B] запросов для обновления каких-то 9 элементов! А что будет, если подгрузить понадобится 200, 500 позиций?
[B]Важно[/B]: используются [URL=http://dev.1c-bitrix.ru/api_help/iblock/2.0/infoblock2.php]инфоблоки+[/URL], т.е. хранение в отдельных таблицах.
На данный момент сама по себе задача решена:
1) Файлы csv + картинки загружаются в 1 zip архиве
2) Архив распаковывается
3) Сначала обрабатываются построчно данные из csv файлов
4) Наконец подгружаются кратинки к элементам
То есть все работает.
[B]Проблема[/B]: в том, что при всем при этом уж больно много запросов возникает даже для небольших файлов с данными.
[B]Собственно вопрос[/B]: кто какие способы оптимизации предложит?
На данный момент используется:
1) Для добавления нового элемента ($Element содержит сразу и PROPERTY_VALUES):
[CODE]$el = new CIBlockElement;
$ID = $el->Add($Element);[/CODE]2) Для обновления элемента:
Сначала для обновления свойств
[CODE]foreach($ElementProps as $PropCode=>$Value){
CIBlockElement::SetPropertyValues($ElementID, $IBlock["ID"], $Value, $PropCode);
}[/CODE]этот код вызванный для 9 элементов (по 4-5 свойств у каждого) генерирует ~136 запросов.
Затем для обновления самого элемента (и поискового индекса)
[CODE]$el = new CIBlockElement;
$el->Update($ElementID, $Element);[/CODE]этот код вызванный для 9 элементов ($Element содержит только NAME, ACTIVE, DATE_ACTIVE_TO) генерирует ~535 запросов (! вообще ужас). На сколько я понял, в основном запросы тратятся на обновление поискового индекса... Так как, если его не обновлять (bUpdateSearch=true), количество запросов падает сразу да нескольких штук. Но ведь обновить его нужно, если элемент изменен.
3) Для подгрузки картинок (отдельно для каждого элемента):
[CODE]CIBlockElement::SetPropertyValues($ElementID, $IBlock["ID"], $arPicts, "IMAGE_MAIN");[/CODE]этот код вызванный 5 раз (5 элементов) для загрузки 9 картинок (по 2-3 картинки у некоторых) генерирует ~99 запросов.
Итого около [B]800[/B] запросов для обновления каких-то 9 элементов! А что будет, если подгрузить понадобится 200, 500 позиций?
[B]Важно[/B]: используются [URL=http://dev.1c-bitrix.ru/api_help/iblock/2.0/infoblock2.php]инфоблоки+[/URL], т.е. хранение в отдельных таблицах.