Запуск агентів із cron

Досить часто виникає необхідність перенесення виконання деяких особливо важких агентів на cron . "Важким" вважається агент, який виконується понад 10 хвилин.

Механізм запуску

Перейдіть на сторінку Налаштування > Інструменти > Командний PHP-рядок і виконайте наступний код:

Побачили "Y". З цієї секунди на хітах виконуватимуться лише періодичні агенти.

Перейдіть на сторінку Налаштування > Налаштування продукту > Агенти та налаштуйте показ колонкиПеріодичність. І відредагуйте потрібні вам агенти виставивши прапорціПеріодичність виконання: через заданий інтервал.

Виставте періодичність, наприклад: */10 * * * * - що означає раз на десять хвилин.

Якщо set_time_limit дозволено, час виконання може перевищувати те, що стоїть в налаштуваннях файлаphp.ini.

Але необхідно пам'ятати, що є обмеження з боку хостера: обсяг пам'яті, час виконання, періодичність запуску і т.д.

Узагальнене рішення для виконання всіх агентів з-під cron

Спочатку повністю відключимо виконання агентів на хіті. Для цього виконаємо наступну команду в php консолі:

В результаті виконання має бути "NN".

Після цього прибираємо з файлу /bitrix/php_interface/dbconn.php визначення наступних констант:

І додаємо в цей файл:

Створюємо файл перевірки агентів та розсилки системних повідомлень /bitrix/php_interface/cron_events.php :

І додаємо цей скрипт вcron:

Після цього всі агенти та відправка системних подій будуть оброблятися з-під cron, раз на 5 хвилин.

Щоб не збільшувалась черга надсилання поштових повідомлень, рекомендується змінити параметр, який відповідає за кількість поштових подій, що обробляються за раз. Дляцього виконуємо у php консолі наступну команду:

Якщо черговий запуск cron_events.php відбувся до завершення роботи раніше запущеного скрипта, то запуску агентів не відбудеться і скрипт завершить свою роботу. (Оскільки агенти блокуються на час виконання.) В даному випадку обробка нічим не відрізняється від обробки на хіті, новий хіт може статися в той момент, коли ще не відпрацювали агенти на попередньому.

Як правило, скрипти виконані підcron, не мають обмеження на час виконання. Але якщо в скриптах використовуються методи для роботи з БД, можна зіткнутися з помилкою виконання вкладених скриптів. Щоб уникнути цієї помилки, можна підправити значення вdbconn.php:

Права доступу

Інтерпретатор php з консолі на сервері має бути запущений з такими самими налаштуваннями, як і веб-сервер. Інакше можлива ситуація, що при запуску php з-підcliпараметриmbstring.func_overloadтаinternal_encodingвідрізняються. Це призводить до трудно-налагоджуваних помилок.

Користувач, з-під якого виконується скрипт агентів, був тим самим, що й користувач веб-сервера. Часто виникають помилки, пов'язані з правами, якщо агент створює кеш, а веб-сайт не може його прочитати або видалити.

Якщо завдання все ж таки необхідно додавати завдання від імені іншого користувача (наприклад, root), то в записіcrontabпотрібно вказати ім'я цього користувача:

Ще приклад

Ось типовий код скрипта, що запускається під cron: