Jump to content
SpravkaCRM.ru - Ваш справочник по CRM
SpravkaCRM.ru

Единоразовая задача в планировщике

Recommended Posts

Всем привет!

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

  1. Пользователь должен запустить "тяжелый" алгоритм, результаты которого не надо сразу получить на экране. Например: синхронизация CRM-системы с какой-либо другой системой (если честно, я этот механизм "подсмотрел" в библиотеки связки Mautic и SuiteCRM). То есть пользователь где то в системе запускает синхронизацию и продолжает далее работать в CRM-системе, а CRM-система в этот момент производит долгую ресурсоёмкую процедуру синхронизации.
  2. В теории можно настроить запуск планировщик SuiteCRM на запуск из под root. Таким образом в задачах, выполняемых в планировщике, появится полный доступ к всему серверу. Это может пригодиться для каких то специфических задач (все же обычно запускать crontab из под root не рекомендуется). В этом случае запуск задачи из планировщика позволит сделать что то такое, что выполнить простым запросом не получится (в частности в данный момент при написании статьи мне было необходимо менять chmod у файла с логами php, которые создавались из под root).
  3. Нужна некая отсрочка выполнения некой задачи.
  4. Наверное можно еще много чего напридумывать, но статья про запуск задач в планировщике, а не про зачем это надо )))

Итак. Общий посыл к тому, что у нас должно происходить:

  • Есть некая задача в планировщике
  • Эту задачу не видно в списке задач, она не предназначена для цикличного воспроизведения, только разовый запуск
  • Мы должны иметь некий механизм, который указывает ЕДИНОРАЗОВО запустить нашу задачу в планировщике
  • Планировщик, используя его встроенные механизмы, видит необходимость запуска задачи и выполняет это действие

Теперь давайте перейдем к практике.

Давайте начнем с механизма создания задачи в планировщике:

require_once('modules/SchedulersJobs/SchedulersJob.php');
require_once("include/SugarQueue/SugarJobQueue.php");

// Создаем задачу в планировщике
$job = new SchedulersJob();
$job->name = "postInstall";
$job->target = "class::postInstallCRMHosting";
$job->assigned_user_id = '1';
$job->execute_time =$GLOBALS['db']->convert($GLOBALS['timedate']->getNow()->modify("+10 seconds")->asDb(), 'datetime');
$jq = new SugarJobQueue();
$jq->submitJob($job);

Этот блок создаст запись в таблице `job_queue` (да да, именно в той, куда валятся все логи выполняемых задач в планировщике). Мы создаем запись с названием "postInstall" и указываем, что должен выполниться класс postInstallCRMHosting. Время выполнения - через 10 секунд. На самом деле задачи в планировщике выполняются по тикам crontab, который запускается ежеминутно в начале минуты. По этому если надо "прям сейчас", то все равно будет в ближайшую минуту. Но пусть будет 10 секунд. Также, при необходимости, можно указать через час/день/год.

Таким образом в ближайшие минуту система попытается запустить выполнение задачи в классе postInstallCRMHosting. Давайте добавим файл с таким классом. Проще всего (и думаю правильнее всего) добавлять задачи в папку /custom/Extension/modules/Schedulers/Ext/ScheduledTasks. Например, файл с моей задачей будет выглядеть примерно так:

/custom/Extension/modules/Schedulers/Ext/ScheduledTasks/CRMHosting.postInstall.php

<?php
/**
 * Created by PhpStorm.
 * User: crmhosting
 * Date: 06.05.2018
 * Time: 9:39
 */

class postInstallCRMHosting implements RunnableSchedulerJob {
    public function setJob(SchedulersJob $job) {
        $this->job = $job;
    }

    public function run($job_data) {

        /************************************
         * Назначаем права на файл с логами
         */

        $log_file = "/var/log/php-fpm/www-error.log";
        exec("chmod 0777 " . $log_file);


        /************************************/

        return true;

    }

}

Таким образом SuiteCRM выполнит наш скрипт единоразово в планировщике. В списке задач планировщика ничего не появится лишнего.

Можно подобным образом запускать задачу необходимое количество раз. 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×