Всем здравствуйте.
Есть 2 варианта одного и того же - заполнение свойства по дескрипшину картинки.
1 вариант - работает очень долго(20-28 секунд), но потребяет памяти 94980808
[CODE] $products = \CIBlockElement::GetList(
[],
[
'IBLOCK_ID' => 26,
'ACTIVE' => 'Y',
],
false,
false,
[
'ID',
'IBLOCK_ID',
'DETAIL_PICTURE',
]
);
while (($product = $products->GetNextElement()) !== false) {
$productFields = $product->GetFields();
$productProps = $product->GetProperties();
$arFile = \CFile::GetFileArray($productFields["DETAIL_PICTURE"]);
if ($arFile['DESCRIPTION'] == 'color') {
if ($productProps['COLOR_IMG']['VALUE'] != $productFields["DETAIL_PICTURE"]) {
\CIBlockElement::SetPropertyValuesEx(
$productFields['ID'],
$productFields['IBLOCK_ID'],
[
'COLOR_IMG' => $productFields["DETAIL_PICTURE"],
]
);
}
}else{
foreach ($productProps['MORE_PHOTO']['VALUE'] as $key => $value) {
if ($productProps['MORE_PHOTO']['DESCRIPTION'][$key] == 'color') {
if ($productProps['COLOR_IMG']['VALUE'] != $value) {
\CIBlockElement::SetPropertyValuesEx(
$productFields['ID'],
$productFields['IBLOCK_ID'],
[
'COLOR_IMG' => $value,
]
);
}
}
}
}
}[/CODE]
2 вариант(2-4 секунды), но памяти потребляет 1651298448(что в 15-17 раз больше предыдущего варианта)
[CODE]
$products = \CIBlockElement::GetList(
[],
[
'IBLOCK_ID' => 26,
'ACTIVE' => 'Y',
],
false,
false,
[
'ID',
'IBLOCK_ID',
'DETAIL_PICTURE',
]
);
$rprArr=[];
while ($fields = $products->Fetch()) {
$items[$fields['ID']] = [
'ID' => $fields['ID'],
'IBLOCK_ID' => $fields['IBLOCK_ID'],
'DETAIL_PICTURE' => \CFile::GetFileArray($fields["DETAIL_PICTURE"])
];
$rprArr[$fields['ID']] = $fields['ID'];
}
\CIBlockElement::GetPropertyValuesArray($rprArr, 26, array(
'ID' => $rprArr,
'IBLOCK_ID' => 26,
));
foreach($rprArr as $kl=>$vl){
if ($items[$kl]['DETAIL_PICTURE']['DESCRIPTION'] == 'color') {
if ($vl['COLOR_IMG']['VALUE'] != $items[$kl]['DETAIL_PICTURE']["ID"]) {
\CIBlockElement::SetPropertyValuesEx(
$kl,
$items[$kl]['IBLOCK_ID'],
[
'COLOR_IMG' => $items[$kl]['DETAIL_PICTURE']["ID"],
]
);
}
}else{
foreach ($vl['MORE_PHOTO']['VALUE'] as $key => $value) {
if ($vl['MORE_PHOTO']['DESCRIPTION'][$key] == 'color') {
if ($vl['COLOR_IMG']['VALUE'] != $value) {
\CIBlockElement::SetPropertyValuesEx(
$kl,
$items[$kl]['IBLOCK_ID'],
[
'COLOR_IMG' => $value,
]
);
}
}
}
}
}
[/CODE]
Получается хочешь уложиться во время выполнения скрипта 2 вариант лучше, но упираешься в нехватку памяти
пытаешься уложиться в память упираешься в предел времени выполнения
как быть? и тот вариант плох и другой