Планирование задач
Расширение может запускать некоторые процедуры периодически, например, каждые 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.