@Ex1st

Как совершить объемную опрерацию с БД?

Нужно записать свойства ко всем товарам на основе имеющихся свойств.

Проблема в том, что операция получилась объёмной и сервер, по прошествии минут 10-15 возвращает 504 ошибку.

Всего товаров 20к, но ситуацию ухудшает то, что свойства - множественные, и GetList дублирует запись, из-за чего количество итераций увеличивается в десятки раз.

Как можно решить проблему?

П.С. код запроса
$vaz2107 = array(
    39819, 39820, 39821, 39822, 39823, 39824, 39825,
    'ID_GROUP' => 44219
);

$res = CIBlockElement::GetList(
    array(),
    array(
        'IBLOCK_ID' => 42,
        'PROPERTY_APPLICABILITY_SECT_VALUE' => $vaz2107,
        'ACTIVE' => 'Y',
    ),
    false,
    false,
    array('ID', 'IBLOCK_ID', 'PROPERTY_APPLICABILITY_SECT', 'PROPERTY_APPLICABILITY_GROUP')
);

while ($data = $res->fetch()) {
    $arPropertyGroup[] = $data['PROPERTY_APPLICABILITY_GROUP_VALUE'];

    // ID Группы, куда добавляем
    array_push($arPropertyGroup, $vaz2107['ID_GROUP']);

    $do = CIBlockElement::SetPropertyValuesEx($data['ID'], 42, array(
        'APPLICABILITY_GROUP' => $arPropertyGroup
    ));
}

if ($do == null) {
    echo 'ok';
} else {
    echo 'no';
}
  • Вопрос задан
  • 65 просмотров
Решения вопроса 1
Tomio
@Tomio
backend developer (python, php)
Чтобы GetList не дублировал записи, вам нужно изменить тип хранения свойств инфоблока на хранение в отдельной таблице:
1SWd44G.png

И еще у вас какая-то странная ситуация происходит вот тут:
$arPropertyGroup[] = $data['PROPERTY_APPLICABILITY_GROUP_VALUE'];

    // ID Группы, куда добавляем
    array_push($arPropertyGroup, $vaz2107['ID_GROUP']);

    $do = CIBlockElement::SetPropertyValuesEx($data['ID'], 42, array(
        'APPLICABILITY_GROUP' => $arPropertyGroup
    ));

У вас на каждой итерации в массиве $arPropertyGroup накапливаются данные. И вы также на каждой итерации все накопленные предыдущие значения присваиваете каждому последующему элементу в цикле 'APPLICABILITY_GROUP' => $arPropertyGroup. Вероятно вы не этого ожидаете в итоге) Ну и плюсом идёт увеличенная нагрузка на БД.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
rpsv
@rpsv
делай либо хорошо, либо никак
Создайте консольный скрипт по аналогии с "агентами на кроне" и запускайте его через консоль.
По поводу агентов: https://dev.1c-bitrix.ru/learning/course/index.php...
Сделайте аналог файла /bitrix/php_interface/cron_events.php, уберите все что касается агентов и пишите свой код
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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