FFCMS Wiki

Официальная документация разработчика и администратора

Инструменты пользователя

Инструменты сайта


core:cronmanager

Планировщик заданий (Cron)

FFCMS, как и другие популярные системы управления данными, содержит классическую реализацию планировщика задач и выполнения задач по расписанию (Cron manager). Планировщик задач в ffcms умеет регистрировать регулярные события, которые равномерно повторяются через определенный интервал времени.

Планировщик задач, по большей степени необходим для выполнения трудоемких или долгих по времени выполнения операций через какой-либо промежуток времени. Чаще всего, планировщик задач используют для регулярного получения и обработки данных с какого-либо удаленного ресурса и последующим использованием этих данных на сайте(в случае, когда прямая загрузка и обработка таких данных по запросу пользователя была бы затруднительной).

Регистрация задания

Для регистрации задания в менеджере задач следует использовать вызов метода App::$Cache→register($class, $function, $delay), где $class и $function - соответствующее название класса и функции, которые будут вызываться каждые $delay секунд интервала времени.

Функция, в которую будет совершатся обратный вызов (callback) каждые n-секунд времени должна быть публичной и статичной в рамках указанного класса. Рассмотрим простой пример реализации регистрации статической функции в планировщике задач во время установки приложения:

namespace Apps\Controller\Admin;
 
use Ffcms\Core\App;
use Extend\Core\Arch\AdminController;
use Ffcms\Core\Helper\Url;
use Ffcms\Core\Helper\FileSystem\File;
 
class MyApp extends AdminController
{
    const CRON_RUN_DELAY = 120; // in seconds
 
    // callback cron task
    public static function scheduledTask()
    {
        // make your actions ever 120 seconds. As example - download & save some data
        $bigData = Url::download('http://some-data-server/big_data.csv');
        File::write('/upload/data/big-data.csv', $bigData);
    }
 
    // install action - run when app is installing
    public static function install()
    {
        // .... some code .... //
        // register scheduled task
        App::$Cron->register('Apps\Controller\Admin\MyApp', 'scheduledTask', static::CRON_RUN_DELAY);
    }
 
}

Давайте подробней разберемся что же здесь происходит. Метод install() будет вызван один раз - при установке приложения и именно в этот момент мы зарегистрируем наш обратный вызов (callback) для выполнения нашей задачи. Мы регистрируем: Apps\Controller\Admin\MyApp::scheduledTask на выполнение через каждые static::CRON_RUN_DELAY секунд. В самом статическом методе scheduledTask() демонстрируется пример загрузки удаленного файла и сохранения его в локальной директории - эта операция будет повторятся каждые 120 секунд.

Все зарегистрированные задачи хранятся в виде массива в файле /Private/Config/Cron.php - существует 2 глобальные секции, instances и log - в первой хранятся сами задачи, а во 2ой - результат их выполнения и время следующего выполнения.

Удаление задачи

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

App::$Cron->remove($class, $method);

где в качестве аргументов $class и $method указать точку обратного вызова для зарегистрированного задания (аналогично разделу выше).

Лучшие концепции

  • Планировщик задач должен использоваться исключительно для целей оптимизации работы приложений и системы - для процессов затратных по ресурсам или по времени исполнения
  • Планировщик задач может использоваться для загрузки/выгрузки, сохранения, обработки (парсинг) данных
  • Планировщик задач может использоваться для работы с внутренней архитектурой системы (создание, изменение или удаление тех или иных файлов, папок, баз данных или прочего через промежуток времени)
  • Планировщик задач может использоваться для рассылки сообщений
  • Планировщик задач НЕ должен использоваться для генерации конечных видов (view) или готового html/css/прочего кода
core/cronmanager.txt · Последние изменения: 2016/06/28 12:39 (внешнее изменение)