Добрый день.
Нужен совет по оптимизации работы скрипта наполняющий инфоблок из файла.
Подробнее:
К каждому товару привязан текстовый файл с описанием модели автомобиля для которой подходит данный товар.
формат файла следующий:
Bentley;Arnage;1 поколение (1998-2002);6.75 Twin-Turbo AT (405 л.с.);
Bentley;Arnage;1 поколение (1998-2002);6.75 Twin-Turbo AT (457 л.с.);
BMW;1 серия;E81/E82/E87/E88 [рестайлинг] (2007-2012);114i MT (102 л.с.);
BMW;1 серия;E81/E82/E87/E88 [рестайлинг] (2007-2012);116d AT (116 л.с.);
Причем записи в файле отличаются могут быть такие:
Bentley;Arnage;1 поколение (1998-2002);6.75 Twin-Turbo AT (405 л.с.);
могут быть такие:
Bentley;Arnage;1 поколение (1998-2002);
или такие:
Bentley;Arnage;
Изначально из содержимого данных файлов формировался многомерный массив на основе данного массива далее формировался фильтр подбора товара.
Но с увеличением объема файлов (некоторые файлы содержат по 25к записей), а при условии, что товаров более 1000шт, то получаем неприемлемо медленно работающий сайт.
В связи с этим решил перенести данные из файла в инфоблок. Первый элемент в строке становится подразделом инфоблока, а элементами инфоблока становятся все подходящие под данный бренд записи:
например строка: Bentley;Arnage;1 поколение (1998-2002);6.75 Twin-Turbo AT (405 л.с.);
имя подраздела : Bentley
элементы подраздела:
Bentley;Arnage;1 поколение (1998-2002);6.75 Twin-Turbo AT (405 л.с.);
Bentley;Arnage;1 поколение (1998-2002);6.75 Twin-Turbo AT (457 л.с.);
У элементов есть множественное свойство типа строка "совместимость" в которое записывается id товара из которого обрабатывается файл.
и так далее по всем товарам, перебираем и записываем данные из файла в инфоблок.
В принципе скрипт выполняет требуемую функцию, но время выполнения очень долгое, если на локальном сайте можно увеличивать время выполнения скрипта до бесконечности (ini_set('max_execution_time', 1000); ), то на хостинге это не прокатит.
Собственно код:
Код |
---|
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
ini_set('max_execution_time', 1000);
use Bitrix\Main,
Bitrix\Main\Loader,
Bitrix\Main\Localization\Loc;
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
$BL_ID = "23";
if($rsProps = CIBlockElement::GetList(array(), array('IBLOCK_ID' => '17', '!PROPERTY_FILES' => false), false, false, array('ID', 'PROPERTY_FILES'))){
while($arProps = $rsProps->fetch()){
$file = CFile::GetByID($arProps['PROPERTY_FILES_VALUE'])->Fetch();
$fileContent = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/upload/'.$file['SUBDIR'].'/'.$file['FILE_NAME']);
$fileContent = preg_replace("/\xEF\xBB\xBF/", "", $fileContent);
$arContent = explode("\n", trim($fileContent));
foreach($arContent as $param){
$param = trim($param);
$arElParams = explode(';', $param);
$bs = new CIBlockSection;
$arFields = Array(
"ACTIVE" => $ACTIVE,
"IBLOCK_ID" => $BL_ID,
"NAME" => $arElParams[0],
"SORT" => "ASC"
);
$rsSec = CIBlockSection::GetList(Array('LEFT_MARGIN' => 'ASC'), Array('IBLOCK_ID' => $BL_ID, "NAME"=>$arElParams[0]));
if($ar_res = $rsSec->Fetch())
{
if($arElParams[0]!='' && $arElParams[1]!=''&& $arElParams[2]!='' && $arElParams[3]!='')
{
$aname= $arElParams[0].";".$arElParams[1].";".$arElParams[2].";".$arElParams[3].";";
}
else if($arElParams[0]!='' && $arElParams[1]!=''&& $arElParams[2]!='' && $arElParams[3]=='')
{
$aname= $arElParams[0].";".$arElParams[1].";".$arElParams[2].";";
}
else if($arElParams[0]!='' && $arElParams[1]!=''&& $arElParams[2]=='' && $arElParams[3]=='')
{
$aname= $arElParams[0].";".$arElParams[1].";";
}
$rsElem = CIBlockElement::GetList(Array('LEFT_MARGIN' => 'ASC'), Array('IBLOCK_ID'=>$BL_ID, "IBLOCK_SECTION_ID"=>$ar_res['ID'], "NAME"=>$aname));
if($ar_El = $rsElem->Fetch())
{
$ELEMENT_ID = $ar_El['ID'];
$VALUES = array();
$res = CIBlockElement::GetProperty($BL_ID, $ELEMENT_ID, Array("sort"=>"asc"), array("PROPERTY_CODE" => "prod_id"));
while ($ob = $res->GetNext())
{
$VALUES[] = $ob['VALUE'];
}
if(!in_array($arProps['ID'],$VALUES))
{
$VALUES[] =$arProps['ID'];
CIBlockElement::SetPropertyValues($ar_El['ID'], $BL_ID, $VALUES, 'prod_id');
}
}
else
{
$el = new CIBlockElement;
$PROP = array();
$PROP['prod_id'] = $arProps["ID"];
$arLoadProductArray = Array(
"MODIFIED_BY" => $USER->GetID(),
"IBLOCK_SECTION_ID" => $ar_res['ID'],
"IBLOCK_ID" => $BL_ID,
"PROPERTY_VALUES"=> $PROP,
"NAME" => $aname,
"ACTIVE" => "Y"
);
$el->Add($arLoadProductArray);
}
}
else
{
$bs->Add($arFields);
}
}
}
}
?>
|
При выполнение скрипта на хостинге, после непродолжительного выполнения получаю ошибку : 504 time out gateway.
Просьба подсказать, как можно оптимизировать данный скрипт чтоб уйти от ошибки 504, или поможет только настройка max_execution_time на сервере?