Необходимо обновить ассортимент товаров (всего чуть больше 60 тысяч позиций). Написал данный скрипт, но после 20 тысяч перестает обновлять. Добавил паузу через функцию sleep, но не помогло. Подскажите пожалуйста как можно грамотней реализовать, чтобы обновить весь каталог
Код |
---|
define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/log.txt");
function editSort(){
if(CModule::IncludeModule("iblock")){
$addProps = CIBlockElement::GetList (
Array("ID" => "ASC"),
Array("IBLOCK_ID" => 26),
false,
false,
Array(
'ID', 'SORT','CATALOG_QUANTITY', 'CATALOG_STORE_AMOUNT_1', 'CATALOG_STORE_AMOUNT_2', 'DETAIL_PICTURE'
)
);
AddMessage2Log(date("d.m.Y H:i:s")." | Старт изменения сортировки", "");
$n = 1;
while($ar_fields = $addProps->GetNext())
{
$n = $n+1;
if($n % 500 == 0){
sleep(60);
}
if($ar_fields['CATALOG_QUANTITY'] == 0){
$arSort = Array(
"SORT" => "1500",
);
} elseif ($ar_fields['CATALOG_STORE_AMOUNT_1'] > 0 or $ar_fields['CATALOG_STORE_AMOUNT_2'] > 0){
$arSort = Array(
"SORT" => "500",
);
} else{
$arSort = Array(
"SORT" => "1000",
);
}
if(isset($arSort)){
$ibp = new CIBlockElement();
$price = CPrice::GetBasePrice($ar_fields['ID']);
if($price["PRICE"] == 0){
$arSort["ACTIVE"] = 'N';
} elseif($price["PRICE"] >0 and isset($ar_fields['DETAIL_PICTURE'])){
$arSort["ACTIVE"] = 'Y';
}
$ibp->Update($ar_fields["ID"], $arSort);
AddMessage2Log(date("d.m.Y H:i:s")." | Изменна позиция -".$ar_fields['ID'], "");
}
}
AddMessage2Log(date("d.m.Y H:i:s")." | Завершение изменения сортировки", "");
}
} |