Планировщик заданий cron
В прошлом уроке мы с вами начали рассматривать пример с рассылкой сообщений раз в день. Мы пришли к выводу, что реализовать это в виде клиент-серверной архитектуры нормально не получится и решили использовать для этого CLI в PHP. Однако, до сих пор непонятно, каким образом можно запускать этот скрипт по расписанию. Для этого используется планировщик заданий, называющийся cron.
cron – это такая программа в операционных системах Unix, которая позволяет очень простым способом запускать различные программы по расписанию. Для этого нужно в специальный конфигурационный файл этой программы прописать нужные настройки. В этом файле настроек действует простое правило – одна строчка в файле = одно запланированное действие. То есть если мы хотим по расписанию запускать какую-то одну программу, то нам нужно создать для нее одну строку в файле настроек. Нужна еще одна программа с другим расписанием? Не вопрос – просто добавляем еще одну строку в этот файлик.
Каждая строка состоит при этом из двух частей:
- Расписание, по которому нужно что-то выполнить;
- Команда, которую нужно выполнять.
И если команда в большинстве случаев – это просто путь к нужной программе с передачей в нее аргументов, то расписание в cron – вещь к которой нужно привыкнуть. Ведь представляет оно собой ни что иное, как 5 выражений, разделенных пробелами. Вот простейший пример файла конфигурации для cron:
0 0 * * * php c:\OSPanel\domains\myproject.loc\bin\cli.php Minusator -x=20 -y=17
Где цифры обозначают:
0 0 * * * команда_для_запуска
- - - - -
| | | | |
| | | | - День недели (0 - 7) (воскресенье = 0 или 7)
| | | --- Месяц (1 - 12)
| | --- День месяца (1 - 31)
| ---- Час (0 - 23)
----- Минута (0 - 59)
В нашем примере команда будет запускаться каждый день каждого месяца в 00:00. Звездочки – значит «каждый» час, день, и т.п. Конкретное значение – это конкретное значение, простите за тавтологию =)
Если мы хотим запускать команду каждую минуту, то часть с расписанием будет выглядеть вот так:
* * * * * команда_для_запуска
Если 1-го числа каждого месяца в 04:20, то:
20 4 1 * * команда_для_запуска
Операторы
Кроме вышеупомянутой звездочки есть и другие операторы.
Слэш (/)
*/20 * * * * команда_для_запуска
С помощью слэша можно задать периодичность выполнения. Команда выше будет запускаться каждые 20 минут.
Запятая (,)
1,10,20 * * * * команда_для_запуска
С помощью запятой можно просто перечислить значения. Команда выше будет запускаться в первую, десятую и двадцатую минуту каждого часа.
Тире (-)
* 9-17 * * * команда_для_запуска
С помощью тире можно указать диапазон. Команда выше будет запускаться каждую минуту с 9:00 до 17:59.
Используем cron
Вообще cron – это утилита из операционной системы Linux. Она поддерживается большинством современных хостингов, и когда вы будете выкладывать свой сайт на хостинг – вы сможете её использовать. Для тех же, кто под виндой, спешу обрадовать – в OpenServer есть своя реализация cron.
Для этого нужно зайти в настройки OpenServer и перейти во вкладку «Планировщик заданий».
Давайте добавим в планировщик следующее задание:
* * * * * php c:\OSPanel\domains\myproject.loc\bin\cli.php TestCron -x=20 -y=17
Сделайте всё, как на скриншоте и нажмите «Добавить».
Команда успешно добавлена в расписание.
Но у нас пока нет класса TestCron. Давайте его создадим.
src/MyProject/Cli/TestCron.php
<?php
namespace MyProject\Cli;
class TestCron extends AbstractCommand
{
protected function checkParams()
{
$this->ensureParamExists('x');
$this->ensureParamExists('y');
}
public function execute()
{
// чтобы проверить работу скрипта, будем записывать в файлик 1.log текущую дату и время
file_put_contents('C:\\1.log', date(DATE_ISO8601) . PHP_EOL, FILE_APPEND);
}
}
Ждём пару минут и проверяем файлик на диске C:.
C:\1.log
2018-10-20T20:09:02+0300
2018-10-20T20:10:02+0300
Как видим, наш скрипт выполнялся с интервалом в одну минуту.
Теперь вы знаете, как использовать планировщик cron для своих целей. Он используется абсолютно для разных задач – начиная от рассылок писем с поздравлениями и заканчивая выгрузками статистики из базы данных несколько раз в день. А один мой товарищ использует cron для полива цветов раз в день – для этого он написал небольшую программку для Raspberry PI и использует крон для её запуска по расписанию. Идеи могут быть самыми разными – всё, что нужно запускать по расписанию, можно сделать с помощью этого мощного и в то же время простого инструмента.
Комментарии