Простой планировщик заданий с управлением через базу данных mysql и простой установкой.
Планировщик раз в минуту проверяет новые задания в базе данных и выполняет их. Каждая задача выполняется отдельным процессом. Важно отметить, что планировщик не предоставляет никакие средства для обеспечения безопастности при выполнении. Тот, кто его использует, сам определяет область его влияния. Все что делает планировщик - это выполняет задания, которые ему дают.
Планировщик рекомендуется использовать для локальных целей в своих домашних или изолированных сервисах.
После выполнения планировщик записывает данные о выполнении в базу (вывод задачи и время выполнения), что позволяет полноценно отследить работу планировщика и выполнение задачи.
Класс демонизации был позаимствован у Petr Bondarenko, но в итоге был немного переделан и часть кода пришлось убрать.
Планировщик позволяет выполнять команды через определенный интервал времени. Базовые интервалы определяются возможностью mysql
- YEAR Год
- MONTH Месяц
- DAY День
- HOUR Час
- MINUTE Минута
- SECOND Секунда
Помимо интервала, можно указать количество интервалов, через которые должно выполняться задание. Таким образом, можно формировать привычные для нас интервалы, например '7 DAY' - 1 неделя и т.п.
Планировщик может ограничить количество выполнения одной задачи.
Можно указать задачу, как singleton
, копии этой задачи не будут созданы.
Это полезно если нужно часто запускать задачу с неопределнным временем выполнения.
Требования для работы планировщика:
- PHP версии 7.0 или выше. Работа на PHP 5.* не гарантирована
- Mysql версии 5.5 или выше.
Необходимо выполнить scheduler.sql
, после чего будет создана структура для работы планировщика.
По умолчанию создается одна задача Test
, которая запускает ps ax
раз в минуту.
Также требуется настроить подключение к базе данных в файле config.php
.
При указании в качестве хоста localhost
, может возникнуть проблема с подключением к базе данных.
Для корректной работы необходимо указвать хост 127.0.0.1
После установки и настройки можно запустить планировщик
php ./run.php start
Если в вывод не попали ошибки, значит все сделано правильно, и теперь мы можем
наблюдать появление новых строк о результате выполнения в таблице tbl_task_history
.
Нужно учитывать, что при перезагрузке системы, планировщик не будет автоматически запущен.
Вы сами должны определить область его влияния и, соответсвенно, сами настроить автоматический запуск планировщика.
Ниже будет приведен пример настройки автоматического запуска для Ubuntu (systemd)
Планировщик поддерживает команды start
,stop
,restart
,status
.
Чтобы добавить задачу, необходимо добавить строку в таблицу tbl_task
.
Описание полей таблицы:
- name
VARCHAR(255)
- название задания - description
TEXT
- описание задания - command
TEXT
- команда - singleton
TINYINT(1)
- запрет повторного запуска задачи (если прошлая задача еще не была выполнена) - repeat
TINYINT(1)
- повторять (1) или нет (0) - repeat_count
INT(11)
- сколько раз повторять (0 без ограничений) - interval
VARCHAR(45)
- интервал (список поддерживаемых интервалов указан выше) указывать строкой например 'DAY' - interval_count
INT(11)
- количество интервалов - start_datetime
DATETIME
- дата начала (см. last_datetime) - end_datetime
DATETIME
- дата окончания действия (если вы хотите, чтобы задание продолжало запускаться до конкретной даты) - last_datetime
DATETIME
- дата время последнего запуска. ВАЖНО именно от этой даты идет отсчет интервалов, поэтому при вставке указывать эту дату равной дате начала - create_datetime
TIMESTAMP
- дата время создания, заполняется автоматически
Результат выполнения хранится в таблице tbl_task_history
.
Описание полей таблицы:
- id_task
INT(11)
- идентификатор задания - result
TEXT
- вывод выполнения задания - execute_time
DECIMAL(11,6)
- время, потраченное на выполнение задания - create_datetime
TIMESTAMP
- дата время создания, заполняется автоматически
Чтобы добавить в автозагрузку планировщик, необходимо отредактировать файл phpschedule.service
согласно вашей конфигураци.
После чего необходимо скопировать его в /etc/systemd/system/
Нужно проверить правильность настройки сервиса
systemctl start phpschedule
Если все хорошо, можно добавить его в автозагрузку
systemctl enable phpschedule