Каталог решений

Покупка продления купона

Продолжительность:
Общая сумма:
0 руб.
Ваш запрос успешно отправлен!
Условия использования
Продлить
Продолжить покупки

Пошаговая обработка скриптов

Модуль позволяет реализовать пошаговую обработку скриптов.Пошаговое выполнение работает в 3-х режимов - обычный(на странице), cron, ajax.Внимание - модуль предназначен только для разработчиков, при нахождении ошибок просьба отписаться на почту web@wizard-c.ru или оставить комментарий.Есть проблема с очень большим выполнением шагов на кроне - решается настройкой сервера, есть 2 вариант - это перезапуск выполнения, но это пока что не написано

Пошаговая обработка скриптов

Пошаговая обработка скриптов

Описание

Технические данные

Опубликовано:
08.08.2017
Версия:
1.0.0
Установлено:
Менее 50 раз
Подходящие редакции:
«Первый сайт», «Старт», «Стандарт», «Малый бизнес», «Эксперт», «Бизнес», «Корпоративный портал», «Энтерпрайз»
Адаптивность:
Нет
Поддержка Композита:
Нет

Описание

Модуль позволяет реализовать пошаговую обработку скриптов.

Пошаговое выполнение работает в 3-х режимов - обычный(на странице), cron, ajax.

Внимание - модуль предназначен только для разработчиков, при нахождении ошибок просьба отписаться на почту web@wizard-c.ru или оставить комментарий.

Есть проблема с очень большим выполнением шагов на кроне - решается настройкой сервера, есть 2 вариант - это перезапуск выполнения, но это пока что не написано
Отзывы (0)
Пока что нет отзывов.
Обсуждения (0)
Здесь пока никто ничего не написал. Будьте первым.
Установка


1) Устанавливаем модуль

2) Для запуска пошаговой обработки необходимо создать файл который будет отвечать за пошаговость(step.php), затем создать папку и в нее уже положить скрипты которые должны выполнять по шагам.

3) Пример
//Инициализация скрипта
$documentRoot = (!isset($_SERVER['DOCUMENT_ROOT']) || empty($_SERVER['DOCUMENT_ROOT'])) ? realpath(
   __DIR__ . '/../..'
) : $_SERVER['DOCUMENT_ROOT'];//Устанавливаем путь к корневой папке сайта
$moduleDir = 'local';//bitrix - установка папки с утсановленным модулем
$pathToModule = $documentRoot . '/' . $moduleDir . '/modules./wizard.scriptbysteps';//путь до модуля
$pathToModuleInclude = $pathToModule. '/include';//путь до папки с include
//Подключаем пролог с установленными переменными
$path = $pathToModuleInclude . '/startAjax.php';
if (file_exists($path))
   require_once($path);
else
   die();
unset($path, $documentRoot);

\Bitrix\Main\Loader::includeSharewareModule('wizard.scriptbysteps');
\Bitrix\Main\Loader::includeSharewareModule('wizard.additional');

//Инициализация логгера
$logger = new Wizard\Additional\Logger;
$logger->activate();
$logger->setType('normalize');

//Шаги выполнения, расположенные по порядку
$arSteps = [
   'unzip',//Распаковка архива
   'reindex',//Переиндексация
   //'updateFacet',//Обновление фасеты
   'clearCache',//Очистка кеша
];
//Инициализация параметров для пошаговых скриптов - не обязательно - но это то что будет доступно в скриптах
$arParams = [
   'IBLOCK_ID'        => 4,
   //Инфоблок товаров
   'OFFER_IBLOCK_ID'  => 6,
   //Инфорблок торговых предложений
   'EXEC_DELETE_FILE' => $_SERVER['DOCUMENT_ROOT'] . '/wizard/files/execDelete.data',
   //Путь к файлу для запуска удаления
   'BLOCK_PARTIAL'    => $_SERVER['DOCUMENT_ROOT'] . '/wizard/files/blockPartial.data',
   //Путь к блокирующему файлу частичной выгрузки
   'ARCHIVE_FILE'     => $_SERVER['DOCUMENT_ROOT'] . '/upload/images/123.zip',
   //Путь к файлу с архивом
   'BEGIN_STEP'       => 'unzip',
   //Начальный шаг, обязательный параметр
   'PATH_TO_MODULE'   => $pathToModule
   //Путь к модулю
];
//Параметры прерывания, устанавливается если есть дополнительное условие на прерывание всей обработки или шага
//доступны параметры begin и step
$arStepParams = [
   'cancel' => [
      'begin' => (bool)!file_exists($arParams['ARCHIVE_FILE'])
   ]
];
//Инициализация скрипта
$obScriptBySteps = \Wizard\ScriptBySteps::getInstance();
$obScriptBySteps->setOperationCode('normalize');//Установка типа обработки обычно совпадает с названием файла и обязан совпадать с название папки
$obScriptBySteps->setScriptFilesFolder(__DIR__);//Устанавливаем раздел где будет искаться папка с пошаговыми скриптами
if (is_object($logger))
   $obScriptBySteps->setLogger($logger);//Устанавливаем логгер чтобы он был доступен в пошаговых скриптах
$obScriptBySteps->setTimeLimit(60);//Устанавливаем ограничение шага по времени
$obScriptBySteps->setElementLimit(2000);//Устанавливаем ограничение шага по элементам
if (isset($arSteps) && is_array($arSteps) && !empty($arSteps)) {
   $obScriptBySteps->setSteps($arSteps);//Устанавливаем шаги
   unset($arSteps);
   if (isset($arParams) && is_array($arParams) && !empty($arParams)) {
      $obScriptBySteps->setParams((array)$arParams);//Устанавливаем параметры
      unset($arParams);
      $obScriptBySteps->setMainScriptFile(__FILE__);//Устанавливаем основной файл запуска
      $obScriptBySteps->execute($arStepParams);//запускаем, запуск может быть без параметров
      unset($arStepParams);
   }
}

//Завершение скрипта
//define('HAS_WORK_WITH_COOKIE', true); //ставить парметр если используем Куки
$path = $pathToModuleInclude . '/endAjax.php';
if (file_exists($path))
   require_once($path); 

4) Файл обработчик
$obScriptBySteps = \Wizard\ScriptBySteps::getInstance();
$arParams = $obScriptBySteps->getParams();//Получаем параметры если нужны
$stepParams = $obScriptBySteps->getStepParams();//получаем значение шага если нужно
$logger = $obScriptBySteps->getLogger();//получаем логгер

//Выполняем необходимые действия

\Bitrix\Main\Loader::includeModule('iblock');
if (!\Bitrix\Main\Loader::includeModule('search')) {
   if (is_object($logger)) {
      $logger->write('Модуль поиска не установлен');
   }
   //Завершение скрипта - досрочное, т.е. идет полное прерывае скрипта, если нужно пропустить шаг то нужно просто поставить параметр bHaveEls=false
   $obScriptBySteps->finishExecute();
   die();
}

if (is_object($logger)) {
   $logger->activate();
}

//Установка начального времени 5мин + 3секунды
$importTimeBegin = \ConvertTimeStamp(START_SCRIPT_TIME - $arParams['MINUTES'] * 60 + 3, "FULL");
//Получение времени последнего обновления или установка начального времени
$lastUpdate = \Bitrix\Main\Config\Option::get('main', 'last_update_normalizePartial', $importTimeBegin);
if (intval($lastUpdate) == 0) {
   $lastUpdate = $importTimeBegin;
}
$lastUpdate = \Bitrix\Main\Type\DateTime::createFromTimestamp($lastUpdate);
//Получение элементов начиная с определенного времени
$arFilter = [
   '>TIMESTAMP_X'       => $lastUpdate,
   'IBLOCK_ID'          => $arParams['IBLOCK_ID'],
   '!IBLOCK_SECTION_ID' => $arParams['OMEGA_SECTION_ID'],
   'ACTIVE'             => 'Y'
];

$arSelectFields = ["ID"];
$elementLimit = $obScriptBySteps->getElementLimit();//Получение ограничения по количеству, так же можно получить ограничение по времени
$params = [
   'select' => $arSelectFields,
   'filter' => $arFilter,
   'limit'  => $elementLimit
];
if ($stepParams['iNumPage'] > 1) {
   $params['offset'] = $elementLimit * ($stepParams['iNumPage'] - 1);
}
$rsElements = \Bitrix\Iblock\ElementTable::getList($params);

//Переиндексация
$arItems = [];
while ($arElement = $rsElements->fetch()) {
   $arItems[] = $arElement['ID'];
}
unset($rsElements);
$countItems = count($arItems);

if ($countItems > 0) {
   if ($stepParams['iNumPage'] <= 1) {
      $logger->write('Переиндексация элементов начата');
   }
   //Переиндексация по элементам
   $totalEls = 0;
   if (!empty($arItems)) {
      foreach ($arItems as $id) {
         $totalEls++;
         //Обновление обычного индекса
         \CIBlockElement::UpdateSearch($id, false);
         //Обновление фасетного индекса элемента
         \Bitrix\Iblock\PropertyIndex\Manager::updateElementIndex($arParams['IBLOCK_ID'], $id);
      }
   }
   //if (is_object($logger)){
   //$logger->write('Переиндексировано '.$totalEls.' элементов за '.(time() - START_SCRIPT_TIME).'с');
   //$logger->writeEndLine();
   //}

   //Установка следующего шага
   $paramsStep = [
      'bHaveEls' => true//параметр true означает что будет запущен этот же шаг повторно но с наращивание счетчика шага
   ];
   $obScriptBySteps->setNewStep($paramsStep);
} else {
   if ($stepParams['iNumPage'] <= 1) {
      $obScriptBySteps->finishExecute();
      die();
   } else {
      //Установка следующего шага
      $paramsStep = [
         'bHaveEls' => false//переход на следующий шаг
      ];
      $obScriptBySteps->setNewStep($paramsStep);
      $logger->write('Переиндексация элементов завершена');
      $logger->writeEndLine();
   }
}


Поддержка
Если у вас возникли вопросы по решению можете написать на почту - web@wizard-c.ru. Консультации по установке не производятся.

Лицензионное соглашение

Другие решения разработчика

Решение добавлено в корзину

Перейдите в корзину и оформите заказ или продолжите покупки
Перейти в корзину
Продолжить покупки