Планировщик⚓︎
Планировщик Grav — это новая функция, которая была добавлена в Grav 1.6, которая позволяет запускать задания на периодической основе. Базовая обработка зависит от серверного планировщика cron, но после добавления одной записи в службу cron все задания и определённые расписания могут быть настроены через Grav.
Одним из основных преимуществ использования планировщика для обработки задач является то, что они могут выполняться без какого-либо взаимодействия с пользователем и независимо от внешнего интерфейса. Такие задачи, как периодическая очистка кэша, резервное копирование, синхронизация, поисковое индексирование и т. д., являются основными кандидатами на выполнение запланированных заданий.
Установка⚓︎
Первым шагом на пути к настройке планировщика и его готовности к выполнению задач является добавление команды bin/grav scheduler
в службу cron. Самый простой подход - использовать саму команду CLI для вывода соответствующей команды для запуска для установки:
$ bin/grav scheduler -i
Install Scheduler
=================
[ERROR] You still need to set up Grav's Scheduler in your crontab
! [NOTE] To install, run the following command from your terminal:
(crontab -l; echo "* * * * * cd /Users/andym/grav;/usr/local/bin/php bin/grav scheduler 1>> /dev/null 2>&1") | crontab -
В системе Mac отображается полная требуемая команда, поэтому всё, что вам нужно сделать, это скопировать и вставить команду в терминал и нажать return.
Вам необходимо войти в оболочку под тем же пользователем, что и ваш веб-сервер. Это необходимо для того, чтобы пользователь, выполняющий команды schdeduler, соответствовал пользователю веб-сервера, которому необходимо взаимодействовать с этими файлами. Если вы устанавливаете запись crontab с другим пользователем (например, root
), любые созданные файлы будут создаваться от имени этого пользователя root
, а не пользователя webserver
, что может привести к проблемам.
(crontab -l; echo "* * * * * cd /Users/andym/grav;/usr/local/bin/php bin/grav scheduler 1>> /dev/null 2>&1") | crontab -
Вы не получите ответа, но и ошибок получить не должны. После этого можно убедиться, что всё в порядке, повторно запустив команду bin/grav scheduler -i
:
bin/grav scheduler -i
Install Scheduler
=================
[OK] All Ready! You have already set up Grav's Scheduler in your crontab
Вы также можете получить необходимую команду из плагина админки, просто перейдя в Инструменты → Планировщик.
Основы планирования⚓︎
Для планирования работы частота контролируется гибким форматом.
* * * * * *
| | | | | |
| | | | | +-- Year (диапазон: 1900-3000)
| | | | +---- Day of the Week (диапазон: 1-7, 1 — понедельник)
| | | +------ Month of the Year (диапазон: 1-12)
| | +-------- Day of the Month (диапазон: 1-31)
| +---------- Hour (диапазон: 0-23)
+------------ Minute (диапазон: 0-59)
Некоторые примеры:
0 * * * *
запускать один раз в час (каждый час на нулевой минуте) 0 0 * * *
запускать один раз в день (каждый день в полночь и в нулевую минуту) 0 0 1 * *
запускать один раз в месяц (первого числа каждого месяца в полночь и в нулевую минуту) 0 0 1 1 *
запускать один раз в год (в первый день первого месяца каждого года в полночь и в нулевую минуту)
Расширенные опции:
*/5 * * * *
запускать каждые 5 минут
Файл конфигурации⚓︎
Вы можете увидеть, какие задания в настоящее время доступны для Планировщика, выполнив команду bin/grav scheduler -j
:
bin/grav scheduler -j
Scheduler Jobs Listing
======================
┌─────────────────────┬────────────────────────────────────┬───────────┬─────────┬──────────────────┬─────────┐
│ Job ID │ Command │ Run At │ Status │ Last Run │ State │
├─────────────────────┼────────────────────────────────────┼───────────┼─────────┼──────────────────┼─────────┤
│ cache-purge │ Grav\Common\Cache::purgeJob │ * * * * * │ Success │ 2019-02-21 11:23 │ Enabled │
│ cache-clear │ Grav\Common\Cache::clearJob │ * * * * * │ Success │ 2019-02-21 11:23 │ Enabled │
│ default-site-backup │ Grav\Common\Backup\Backups::backup │ 0 3 * * * │ Ready │ Never │ Enabled │
│ pages-backup │ Grav\Common\Backup\Backups::backup │ * 3 * * * │ Success │ 2018-09-20 09:55 │ Enabled │
│ ls-job │ ls │ * * * * * │ Success │ 2019-02-21 11:23 │ Enabled │
└─────────────────────┴────────────────────────────────────┴───────────┴─────────┴──────────────────┴─────────┘
! [NOTE] For error details run "bin/grav scheduler -d"
Планировщик Grav управляется основным файлом конфигурации. Он находится в user/config/scheduler.yaml
, и для его выполнения требуется, чтобы любое задание было enabled
.
Ниже конфигурации показаны доступные задания и разрешено ли им выполнение. Просто установите для записи значение disabled
, чтобы остановить её выполнение.
status:
ls-job: enabled
cache-purge: enabled
cache-clear: enabled
default-site-backup: enabled
pages-backup: enabled
Чтобы увидеть более подробную информацию о любых потенциальных ошибках или увидеть, когда задание будет запущено в следующий раз, вы можете использовать команду /bin/grav scheduler -d
:
bin/grav scheduler -d
Job Details
===========
┌─────────────────────┬──────────────────┬──────────────────┬────────┐
│ Job ID │ Last Run │ Next Run │ Errors │
├─────────────────────┼──────────────────┼──────────────────┼────────┤
│ cache-purge │ 2019-02-21 11:29 │ 2019-02-21 11:31 │ None │
│ cache-clear │ 2019-02-21 11:29 │ 2019-02-21 11:31 │ None │
│ default-site-backup │ Never │ 2019-02-22 03:00 │ None │
│ pages-backup │ 2018-09-20 09:55 │ 2019-02-22 03:00 │ None │
│ ls-job │ 2019-02-21 11:29 │ 2019-02-21 11:31 │ None │
└─────────────────────┴──────────────────┴──────────────────┴────────┘
Запуск заданий вручную⚓︎
Команда CLI предоставляет простой способ вручную запускать любые задания. Фактически, это то, что планировщик делает, когда он запускается периодически.
Это автоматически запустит задания, но вы также можете увидеть подробности того, что запускается, используя:
Системные задания Grav⚓︎
Ядро Grav обеспечивает несколько рабочих мест прямо из коробки. К ним относятся некоторые полезные задачи технического обслуживания:
-
cache-purge
— Эта задача полезна, если вы используете кэширование файлов Grav, поскольку оно удаляет старые файлы, срок действия которых истек. Это отличная задача для планирования, поскольку в противном случае пользователю потребовалось бы вручную очистить старые кэши. Если вы не уследите за этим, а ваше файловое пространство ограничено, у вас может закончиться место и сервер выйдет из строя. -
cache-clear
— Очистка кэша — это задание, которое работает так же, как командаbin/grav clear
, которую вы выполняете вручную. Вы можете настроить, хотите ли вы использовать «стандартную» очистку кэша или вариантall
, который удаляет все файлы и папки в папкеcache/
для более тщательной очистки кэша. -
default-site-backup
— Задание резервного копирования по умолчанию, доступное в новой конфигурации Grav Backup. Вы можете создавать собственные конфигурации резервного копирования, и они также будут доступны для запуска в качестве запланированного задания.
Пользовательские задания⚓︎
В Grav Scheduler можно вручную настроить любое количество пользовательских заданий. Их можно настроить в том же файле конфигурации scheduler.yaml
, упомянутом выше. Например, указанная выше команда ls-job
может быть настроена:
custom_jobs:
ls-job:
command: ls
args: '-lah'
at: '* * * * *'
output: logs/cron-ls.out
output_mode: overwrite
email: user@email.com
Командой должен быть любой локальный сценарий, который можно запустить из командной строки/терминала. Требуются только атрибуты command
и at
.
Задания, предоставляемые плагинами⚓︎
Одна из самых мощных функций Grav Scheduler — это возможность сторонних плагинов создавать собственные задания. Прекрасный пример этого — плагин TNT Search. TNT Search — это полнофункциональная система текстового поиска, которая требует, чтобы контент был проиндексирован, прежде чем его можно будет искать. Это задание индексации может выполняться различными способами, но Grav Scheduler позволяет вам периодически переиндексировать ваш контент, вместо того, чтобы делать это вручную.
Первым делом ваш плагин должен подписаться на событие onSchedulerInitialized()
. А затем создайте метод в своем файле плагина, который может добавлять настраиваемое задание при вызове:
<?php
public function onSchedulerInitialized(Event $e): void
{
$config = $this->config();
if (!empty($config['scheduled_index']['enabled'])) {
$scheduler = $e['scheduler'];
$at = $config['scheduled_index']['at'] ?? '* * * * *';
$logs = $config['scheduled_index']['logs'] ?? '';
$job = $scheduler->addFunction('Grav\Plugin\TNTSearchPlugin::indexJob', [], 'tntsearch-index');
$job->at($at);
$job->output($logs);
$job->backlink('/plugins/tntsearch');
}
}
Здесь вы можете увидеть, как некоторая соответствующая конфигурация планировщика получается из настроек конфигурации плагина TNTSearch, а затем создается новое Job
с статической функцией, называемой indexJob()
.