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

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

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

Примеры

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

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

$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.