Добрый день.
Нужен совет по оптимизации работы скрипта наполняющий инфоблок из файла.
Подробнее:
К каждому товару привязан текстовый файл с описанием модели автомобиля для которой подходит данный товар.
формат файла следующий:
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); ), то на хостинге это не прокатит.
Собственно код:
При выполнение скрипта на хостинге, после непродолжительного выполнения получаю ошибку : 504 time out gateway.
Просьба подсказать, как можно оптимизировать данный скрипт чтоб уйти от ошибки 504, или поможет только настройка max_execution_time на сервере?
Нужен совет по оптимизации работы скрипта наполняющий инфоблок из файла.
Подробнее:
К каждому товару привязан текстовый файл с описанием модели автомобиля для которой подходит данный товар.
формат файла следующий:
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, или поможет только настройка max_execution_time на сервере?