Запланированные задачи

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

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

  • Поместите запланированную задачу в папку /plib/scripts/ относительно корневой папки расширения.
  • Инициализировать контекст расширения (pm_Context::init) перед планированием задачи.
  • Запланировать задачу, используя pm_Scheduler и 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); 
// Сохранение id задачи, чтобы удалить ее, если потребуется

Смотрите пример использования запланированных задач в Упражнении 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);

 

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