Иногда требуется периодически выполнять скрипт, время работы которого не укладывается в рамки серверных ограничений max_execution_time. Например, автоматический импорт больших списков или, как в моем примере, автоматический ресайз картинок инфоблока. В таких случаях требуется использовать пошаговый алгоритм.
Вот мой велосипед:
В данном примере скрипт раз в сутки проверяет наличие новых картинок и ресайзит их, но скрипт можно легко адаптировать и под другие задачи. Этот код можете использовать, если вы, так же как и я, любите использовать функцию ResizeImageGet для уменьшения картинок( http://dev.1c-bitrix.ru/api_help/main...ageget.php ).
Файл ImagesCronResize.php
<?
/*
*
* Скрипт автоматически кэширует все картинки в инфоблоке для ускорения загрузки страниц каталога
*
* */
class ImagesCronResize {
const MAX_EXECUTION_TIME = 40;
const AGENT_TIME_INTERVAL = 5; //минут
/*
* Агент ресайзит все превьюшки в инфоблоке под нужные размеры
*/
public static function resizeAgent($iLastId=0)
{
$startAgentTimestamp = time();
CModule::IncludeModule("iblock");
$arSelect = Array("ID", "NAME", "PREVIEW_PICTURE");
$arFilter = Array("IBLOCK_ID" => CATALOG_IBLOCK_ID, "ACTIVE" => "Y",">ID" => $iLastId );
$res = CIBlockElement::GetList(Array("ID"=>"ASC"), $arFilter, false, false, $arSelect);
while ($ob = $res->GetNextElement()) {
$arFields = $ob->GetFields();
if ($arFields['PREVIEW_PICTURE']>0) {
CFile::ResizeImageGet( $arFields['PREVIEW_PICTURE'], array('width'=>SMALL_PREVIEW_WIDTH, 'height'=>SMALL_PREVIEW_HEIGHT), BX_RESIZE_IMAGE_PROPORTIONAL, true); //BX_RESIZE_IMAGE_EXACT
CFile::ResizeImageGet( $arFields['PREVIEW_PICTURE'], array('width'=>BIG_PREVIEW_WIDTH, 'height'=>BIG_PREVIEW_HEIGHT), BX_RESIZE_IMAGE_PROPORTIONAL, true);
}
if ((time()-$startAgentTimestamp)>self::MAX_EXECUTION_TIME){
//Добавляем новый агент через 5 минут
self::addOneMoreStepAgent($arFields['ID']);
return false;
break;
}
}
return get_called_class()."::resizeAgent();";
}
public static function addAgent()
{
CAgent::AddAgent(
get_called_class()."::resizeAgent();", // имя функции
"", // идентификатор модуля
"N", // агент не критичен к кол-ву запусков
86400, // интервал запуска - 1 сутки
date("d.m.Y 05:00:00",strtotime("+1 day")),// дата первой проверки на запуск
"Y", // агент активен
date("d.m.Y 05:00:00",strtotime("+1 day")),// дата первого запуска
30);
}
protected function addOneMoreStepAgent($id)
{
CAgent::AddAgent(
get_called_class()."::resizeAgent(".intval($id).");", // имя функции
"", // идентификатор модуля
"N", // агент не критичен к кол-ву запусков
86400, // интервал запуска - 1 сутки
date("d.m.Y H:i:s",strtotime("+".self::AGENT_TIME_INTERVAL." minute")),// дата первой проверки на запуск
"Y", // агент активен
date("d.m.Y H:i:s",strtotime("+".self::AGENT_TIME_INTERVAL." minute")),// дата первого запуска
30);
}
}
?>
Лучше будет, если агенты будут работать на cron'e http://dev.1c-bitrix.ru/community/web...blog/2755/ Надеюсь кому-нибудь пригодится. Может кто посоветует, как улучшить алгортитм и расскажет о своих велосипедах.)
Вербовенко Федор, а) есть способы мониторить подвисшие скрипты б) вот как раз скрипты импорта, которые работают 2 часа нужно делать по крону, и этому процессу корректно выставлять пределы жрания памяти/процессора, чтобы они не мешали веб-серверу и другим процессам.
Привет, сообщество. Нужен совет. Стоит задача переделать один крупный магазин, и сейчас мы стоим перед выбором структуры каталога. Либо все делать на одном инфоблоке, либо разбивать каталог по нескольким инфоблокам. Исходные данные: В магазине около 25 тыс товаров. 30 разнородных разделов. Суммарное количество свойств больше 300. В новой версии сайта нужно будет использовать торговые предложения.
Есть пост в блоге Забродина Романа о выбора структуры каталога для его Битроника https://dev.1c-bitrix.ru/community/web...blog/5478/ На время написания поста, он советует в таких крупных проектах использовать структуру со множеством инфоблоков, но это было до последних нововведений в битриксе.
Минусы варианта с несколькими инфоблоками - возможные проблемы связанные с работой компонентов, которые выводят смешанные товары из разных разделов, например: "Новинки", "С этим покупают." - я не знаю насколько стандартные компоненты такие как корзина и оформление заказа поддерживают такую архитектуру - неудобство поддержки. Добавление и изменение свойств. - возможные проблемы с интеграцией с 1с
Минусы вариант с одним инфоблоком - производительность каталога и умного фильтр - если создавать фасетный индекс, судя по комментариям здесь https://dev.1c-bitrix.ru/community/blo...lean-an... при большом количестве свойств не очень поможет. Не знаю как обстоят дела после последних обновлений. - Придется корячить форму редактирования товара
Есть интернет магазин на 6 тыс товаров с небольшим количеством свойств. Так там умный фильтр очень тормозит, особенно если фильтровать по цене. Фасетный индекс в таком случае не помогает. Я боюсь представить что будет при 30 000 наименований и 300 свойствах.
У меня душа больше лежит к разделению каталога на несколько инфоблоков, но мой руководитель считает что мы так проблем не оберемся и говорит, что рано или поздно придется переделывать на один инфоблок.
У кого есть такой опыт, поделить. В каком направление правильно двигаться? Может уже есть где статьи об этом? Буду благодарен любой помощи.
Большое спасибо всем за отклики. Так как хостинг мощный и есть надежда на оптимизацию фильтра, я решил пойти по пути одного инфоблока. И в дальнейшем, т.к. используем редакцию "большой бизнес" можно будет настроить кластер. Если бы делал на нескольких инфоблоках, делал бы так - cоздал бы инфоблок с элементами, которые определяют свойства и на событиях создавал бы свойства на всех инфоблоках каталога.
Хочу поделиться с вами своей наработкой, которую я использую в свои проектах при работе с инфоблоками. https://github.com/fedyan/BitrixMigration Bitrix Migration - это скрипт с визуальным интерфейсом, который позволяет экспортировать структуру Инфоблоков в php-массив.
Да я знаю, что есть стандартный импорт/экспорт в XML или CSV, но это не то. BM формирует массив типов инфоблока, сами инфоблоки и свойства инфоблока для дальнейшего импорта его, используя API Битрикса.
Как это можно использовать? Основной сценарий использования - это копирование, клонирование или перенос инфоблоков (свойств инфоблока). У вас есть инфоблок с некоторыми свойствами. Задача перенести свойства в другой инфоблок. Запускаете экспорт через BM. Подправляете массив. Загружаете массив через BM.
Во время импорта скрипт проходит весь массив и добавляет типы инфоблока, инфобоки и свойства инфоблока, если они не существуют. Наличие определяется фильтрацией по коду.
Есть ещё один возможный сценарий использования - это использование совместно с git. Идея о создание такого скрипта(BM) пришла ко мне, когда я работал в крупной компании, использующая во всех проектах git. Прямых доступов к базе битрикса рабочего сайта не было, а разработка велась на локальной машине. Почти для всех изменения в базе приходилось писать скрипты. Используя BM - это задача немного облегчается.
Очень круто. Версия 15.5 Перенес структуру блоков с элементами. Без проблем. Единственное, что ИД блоков после переноса изменились, поэтому компоненты нужно перенастроить, имейте введу.
Использую Notepad++ при программирование. После настройки плагина Quicktext, редактор стал очень удобным для быстрой работы. В последнее время захотелось ещё более автоматизировать и ускорить процесс программирования. Возник вопрос ускорения поиска в документации битрикса по ключевому слову. В notepad++ есть стандартный функционал добавления горячих клавиш запуска внешних программ, например если нажать сочетание клавишь Alt+F2 откроется браузер со страницей http://www.google.com/search?q=$(CURRENT_WORD), где $(CURRENT_WORD)- слово, на которое сейчас наведен курсор.(Для редактирования этих команд нужно изменить файла shortcuts.xml в директории C:\Documents and Settings\Admin\Application Data\Notepad++. Редактировать нужно с закрытым Notepad++)
Так вот, сначала я пытался сделать get запрос к поиску в самой документации битрикса http://dev.1c-bitrix.ru/api_help/?Sea...RENT_WORD) . Что не дало результатов, т.к. внешние get запросы страница документации не обрабатывает. Решением стало использование Яндекса для поиска на отдельном сайте. Запрос выглядит так
В дополнение есть интересный плугинчик Language Help который умеет запускать CHM документ с документацией API и нужной строкой поиска. Но он у меня иногда не правильно работал. Может у Вас заработает
З.Ы. Как преверженец нотепада хочу посоветовать изучить AutoHotKeys. Эта штука при правильном применении устраняет все мелкие неприятности работы в нем да и не только.
К примеру конструкция:
; Add BR for Shift + Enter +Enter:: PostMessage, 0x50, 0, 0x4090409,, A ; Switch to English clipboard = <br /> Send, +{INS} clipboard = return
научит его добавлять <br /> по шифт+энтер
а вот такая
; Create empty line before ~^+Enter:: Send, {Home}{ENTER}{Up} return
Добавит пустую строку выше курсора по ктрл+шифт+ентер
Немного пошаманив на ней же можно организовать поиск по пхп на сайте php.net и т.д. разнеся сайты на разные горячие кнопки.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».