# Планирование задач

Расширение может запускать некоторые процедуры периодически, например, каждые 10 минут, каждый час или ежедневно. Этот интерфейс планирования управляет работой утилиты `crontab` в Linux и приложения Планировщик задач в Windows. Этот интерфейс представлен двумя классами: pm_Scheduler и pm_Scheduler_Task. Первый класс представляет собой диспетчер задач, а второй — задачу.

Для успешного планирования задачи ваш код должен отвечать следующим требованиям:

- Поместите запланированную задачу в папку `/plib/scripts/` относительно корневой папки расширения.
- Инициализировать контекст расширения (pm_Context::init) перед планированием задачи.
- Запланировать задачу, используя pm_Scheduler и pm_Scheduler_Task.

## Примеры

Этот пример кода добавляет к планировщику повторяющуюся задачу. Используются следующие методы класса pm_Scheduler_Task :

- setSchedule()
- setCmd()
- getId()

Код может выглядеть так:

    $task = new pm_Scheduler_Task();
    $task->setSchedule(array(
        'minute' => '0,4,9,14,19,24,29,34,39,44,49,54,59',
        'hour' => '*',
        'dom' => '*',
        'month' => '*',
        'dow' => '*'
        ));
    $task->setCmd('five-minutes-task.php');
    pm_Context::init('extension-id');
    pm_Scheduler::getInstance()->putTask($task);
    var_dump($task->getId()); // Save task id in order to remove it if necessary

Смотрите пример использования запланированных задач в Упражнении 2.

## Составление расписания запусков

При составлении расписания запусков обратите внимание на следующие различия для разных операционных систем:

- В Linux расписание можно задать в формате cron. Читайте больше об этом формате здесь: http://www.nncron.ru/help/EN/working/cron-format.htm.

- В Windows расписание можно установить с помощью запятых (,) и звездочек (*).

- Мы рекомендуем вам использовать следующие кроссплатформенные константы для задания периода времени между двумя запусками задачи:

  pm_Scheduler::$EVERY_MIN

  pm_Scheduler::$EVERY_5_MIN

  pm_Scheduler::$EVERY_10_MIN

  pm_Scheduler::$EVERY_HOUR

  pm_Scheduler::$EVERY_DAY

  pm_Scheduler::$EVERY_WEEK

  pm_Scheduler::$EVERY_MONTH

- В Windows для одной задачи можно использовать не более 48 различных условий запуска (триггеров). Читайте больше о триггерах и об этом ограничении здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383619%28v=vs.85%29.aspx

## Перебор задач

Если вам надо организовать циклическое выполнение запланированных задач, сделайте это следующим образом:

    $tasks = pm_Scheduler::getInstance()->listTasks();
    foreach ($tasks as $task) {
        var_dump($task->getId());
        var_dump($task->getSchedule());
        var_dump($task->getCmd());
    }

## Удаление запланированных задач

Мы настоятельно рекомендуем вам сохранить ID запланированных задач в хранилище пар «ключ-значение», прежде чем удалять задачи во время удаления расширения. Следующий код выполняет удаление задачи:

    $task = pm_Scheduler::getInstance()->getTaskById('64daef15d48e0fe038bb20a77a171150');
    pm_Scheduler::getInstance()->removeTask($task);

## Как передавать аргументы в задачи

Если вам надо передать в задачу определенные аргументы, используйте метод setArguments. Следующий код создает задачу с аргументами:

    $task = new pm_Scheduler_Task();
    $task->setSchedule(pm_Scheduler::$EVERY_DAY);
    $task->setCmd('send-daily-report.php');
    $task->setArguments(array('john', 'robert', 'ivan'));
    pm_Scheduler::getInstance()->putTask($task);

Чтобы получить аргументы задачи, используйте метод getArguments, например, так:

    var_dump($task->getArguments());

Обратите внимание, что ID задачи присваивается с помощью метода putTask.