Запуск агентів із 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: