Встроенные CRON задачи, автоматизация

HTTP задачи

В системе реализованы автоматически запускаемые cron задачи. Синтаксис расписаний задается так же как в любой unix системе(Минуты Часы Дни Месяцы Дни недели). Но в данном случае это любые uri запросы на текущий домен, с любыми http методами(POST/PUT/GET/DELETE), с любыми устанавливаемыми заголовками(content-type), и данными тела запроса. Крон задачи можно выполнять от имени других пользователей, если для него включена авторизация x-auth-token и его модель включена и является подчиненной вам по системному весу.

Вы можете включать и отключать определенный функционал проекта по заданному расписанию, или например менять шаблоны страниц с разными дизайнами. Для того, чтобы посмотреть какие именно данные передать в теле запроса для cron задачи при исполнениии определённой модели, включите запись логов действий для свой группы, выполните это действие вручную и посмотрите параметры тела нужного вам запроса в логах(id,action,table)

Автоматизируйте:

  • скидки;
  • поздравления;
  • акции;
  • рекламу;
  • парсинг;
  • маркетинг;
  • сбор информации;

CLI задачи

Кроме методов http вы можете поставить на cron любую cli команду, которая будет выполняться через exec

Внимание
Вы не должны давать права доступа на добавление cron задач кому попало. Это крайне небезопасно!

Выполение задач из CLI и по кнопке

Вы можете запустить любую задачу из CLI перейдя в каталог public_html и вызвав

php -f cron.php 777

где 777 - id вашей задачи.

Задачу можно запустить из админки по кнопке, даже если она отключена, она будет выполнена однократно, без учета натроенных для неё потоков.

Многопоточность задач и контроль нагрузки

Для каждой задачи вы можете устанавливать дополнительные настройки

  • Минимум - минимальное количество запускаемых по расписанию задачей потоков её выполнения
  • Максимум - масксимальное количество выполняемых потоков задачи при котором остальным запускам(потокам) этой задачи будет отказано
  • Держать потоки - если установлено "да", то всегда будет поддерживаться минимальное установленное количество потоков, вне зависимости от периодичности запуска задачи. Каждый поток при запуске будет создавать необходимое количество дополнительных независимых форков.
  • Предел нагрузки - устанавливается и рассчитывается в процентах от 1% до 1000% по формуле: текущий load average / кол-во логических ядер сервера * 100. Например 4/12*100 = 33% нагрузка. Где 4 это текущий la на 12 логических процессорах. 12 la из 12 ядер = 100% нагрузка сервера. 1000% - если сервер ещё работает, значит он крепыш. Если значение превышает установленное - в запуске очередного потока будет отказано. Вы устанавливаете лишь процент допустимой нагрузки при котором выполению данной задачи(любого её потока) будет отказано.

Если вы не понимате зачем это вам, не настраивайте потоки, оставьте их по умолчанию и пользуйтесь cron задачами в их классическом варианте.

Заметки
При использовании большого количества потоков-программ в которых есть бд подключения, позботьтесь о настройках сервера бд max_connections и max_user_connections.

За техническую реализацию встроенного cron отвечает файл public_html/cron.php и класс Task/Cron.php

Файл public_html/cron.php - запускает сам себя curl http запросом каждую минуту загружая метод load(), который в свою очередь посылает короткие независимые cli запросы на выполнение задач к public_html/cron.php, в котором происходит выполение каждой задачи по отдельности. Таким образом задачи полностью распарралеливаются и не зависят по времени выполнения друг от друга, ведь их может быть весьма большой стек и они могут быть весьма ресурсоемкие. Ежеминутно вызывается Wrong\Task\Cron::set_run_at() который проставляет всем задачам следующее(очередное) их время выполнения.

Таким образом реализуется бесконечный ежеминутный цикл, с выполнением задач которые подходят под расписание.

В классе Task/Cron.php реализован контроль за потоками и нагрузкой устанавливаемыми для каждой задачи.

Когда автозапуск ещё не активирован - он активируется при помощи скрытой картинки, которая инжектится в include/session.php при помощи js стека(не всегда, а только если не активирован цикл автозапусков). Это не совсем надежно, если на вашем сайте мало посетителей, т.к. иногда http запрос может не выполниться и цикл самозапуска public_html/cron.php прервется. Бывает весьма редко, и если на сайте совсем никто не бывает, в основном цикл работает как часы. Но чтобы повысить надежность, вы можете дополнительно поставить выполнение public_html/cron.php на свой системный cron раз минуту, вреда от этого не будет (ведь дополнительные потоки блокируются), как скорее всего и пользы.

curl -s -m 1 https://example.com/cron.php >/dev/null 2>&1
wget -qO- https://example.com/cron.php >/dev/null 2>&1
# или так если https сертификаты у вас внешние и прямой доступ по http не ограничен серверными настройками
curl -s -m 1 -H "Host: example.com" http://111.111.111.111/cron.php >/dev/null 2>&1
wget --header="Host: example.com" -qO- http://111.111.111.111/cron.php >/dev/null 2>&1
# где 111.111.111.111 - ip вашего сервера