Как оптимально обрабатывать сложные скрипты в агентах 1С-Битрикс?

Как улучшить реализацию скрипта для заполнения типов цен на сайте при выгрузке 14 тысяч позиций из 1с? В настоящее время, скрипт обрабатывает 600 элементов с галочкой "Обновить типы цен" за раз с интервалом в 600 секунд. Однако, наблюдаются проблемы, такие как ошибка "Deadlock found when trying to get lock; try restarting transaction". Как лучше организовать скрипт, чтобы решить эти проблемы?
  • 11 октября 2023 г. 15:02
Ответы на вопрос 2
Если вы сталкиваетесь с проблемами при обработке сложных скриптов в агентах 1С-Битрикс, есть несколько способов оптимизировать их выполнение:

1. Используйте пакетно-параллельное выполнение: Вместо того, чтобы обрабатывать 600 элементов с интервалом в 600 секунд, можно попробовать обрабатывать несколько элементов одновременно. Например, вы можете разделить 14 тысяч позиций на несколько пакетов (например, по 1000 позиций) и обрабатывать эти пакеты параллельно.

2. Оптимизируйте запросы к базе данных: При обновлении типов цен на сайте, убедитесь, что ваши запросы к базе данных максимально оптимизированы и используют индексы и кеширование, чтобы минимизировать время выполнения.

3. Используйте транзакции: Если вы работаете с транзакциями, убедитесь, что вы используете их оптимально. Например, вы можете захватить транзакцию только на этапе записи данных, чтобы минимизировать блокировку ресурсов.

4. Установите оптимальные настройки PHP: Проверьте настройки PHP на вашем сервере и убедитесь, что они оптимально настроены для выполнения сложных скриптов. Например, вы можете увеличить время выполнения скрипта (например, через параметр max_execution_time) и размер памяти (например, через параметр memory_limit).

5. Мониторинг производительности: Важно отслеживать производительность вашего скрипта и оптимизировать его, если требуется. Вы можете использовать инструменты мониторинга производительности, такие как xDebug или New Relic, чтобы определить проблемные места в коде и улучшить их.
Тяжелые скрипты можно выполнять на кроне, не используя сам Битрикс. Для этого создайте файл со следующим содержимым:

```php
if (substr(php_sapi_name(), 0, 3) !== 'cli') {
    die();
}
define('NO_KEEP_STATISTIC', true);
define('NO_AGENT_CHECK', true);

if (empty($_SERVER['DOCUMENT_ROOT'])) {
    $_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__) . '/../');
}

require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');

// Ваш код, который нужно выполнить

require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_after.php');
```

Этот код подключает необходимые файлы для работы с Битриксом и позволяет выполнять скрипты без нагрузки на сервер.
Похожие вопросы