Планировщик заданий cron

20.10.2018 в 20:23
8224
+465

В прошлом уроке мы с вами начали рассматривать пример с рассылкой сообщений раз в день. Мы пришли к выводу, что реализовать это в виде клиент-серверной архитектуры нормально не получится и решили использовать для этого CLI в PHP. Однако, до сих пор непонятно, каким образом можно запускать этот скрипт по расписанию. Для этого используется планировщик заданий, называющийся cron.

cron – это такая программа в операционных системах Unix, которая позволяет очень простым способом запускать различные программы по расписанию. Для этого нужно в специальный конфигурационный файл этой программы прописать нужные настройки. В этом файле настроек действует простое правило – одна строчка в файле = одно запланированное действие. То есть если мы хотим по расписанию запускать какую-то одну программу, то нам нужно создать для нее одну строку в файле настроек. Нужна еще одна программа с другим расписанием? Не вопрос – просто добавляем еще одну строку в этот файлик.

Каждая строка состоит при этом из двух частей:

  1. Расписание, по которому нужно что-то выполнить;
  2. Команда, которую нужно выполнять.

И если команда в большинстве случаев – это просто путь к нужной программе с передачей в нее аргументов, то расписание в 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 и перейти во вкладку «Планировщик заданий».
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 и использует крон для её запуска по расписанию. Идеи могут быть самыми разными – всё, что нужно запускать по расписанию, можно сделать с помощью этого мощного и в то же время простого инструмента.

loader
20.10.2018 в 20:23
8224
+465
Домашнее задание

Есть задача - нужно запускать php-скрипт каждые 20 секунд. Как это сделать?

Логические задачи с собеседований