Przejdź do głównej treści

Zadania cykliczne (Cron)


W tym rozdziale skupimy się na mechanizmie zadań cyklicznych, uruchamianych przez Cron-a.

Nasz cron działa w połączeniu z bazą danych i ma zapisane zadania w tabeli public.crontab

Dodanie zadania do tabeli

By dodać nowe zadanie dla Crona, należy wykonać bezpośrednio sql-owego insert-a do wyżej wymienionej tabeli.

Przykład

INSERT INTO crontab (every_, hour__, min___, dom___,mon___,dow___, path__,class_, cargs_, meth__, margs_, dscrpt, usr_id, ent_id,is_del )
VALUES      ('day',
             20,
             0,
             NULL,
             NULL,
             '1,2,3,4,5',
             './classes/CronRunner/dispatchers/SummaryReportCronDispatcher.inc',
             'SummaryReportCronDispatcher',
             NULL,
             'forward',
             '',
             'W każdy dzień o 20',
             NULL,
             {ent_id},
             FALSE
             )
Omówienie Tabeli
  • Kolumny
    • hour__ i min___ - mówią o której konkretnie godzinie i minucie ma się uruchomić, podana klass-a
    • every_ - mówi co jaki przedział czasu ma zostać uruchomiony skrypt. Warianty minute i day I tu możemy na chwile się zatrzymać by omówić zależności miedzy powyższymi trzema kolumnami. bo jeśli ustawimy kolumne every_ na minute co znaczy w prost, uruchamiaj klasę co podaną minutę w kolumnie min___ i tu już nie podajem,y konkretnej godziny ! ale jeśli chcemy uruchamiać skrypt co dzień o podanej godzinie i minucie to wystarczy wprowaqdzić w kolumne every_ wartość day i odpowiednio w hour__ min___ wybrany czas.
    • dow___ - tutaj musimy wpisać w jakie dni tygodnia ma zostać uruchomiony skrypt. Uwaga ! Niedziela jest pierwszym dniem tygodnia i odpowiada temu cyfra 0, dla reszty dni tygodnia, kolejno 1,2,3 itd.
    • path__ - czyli ścieżka do pliku, w którym znajduje się klasa,
    • class_ - czyli namespace z nazwą klasy, którą będziemy wywoływać,
    • meth__ - Podajemy nazwę metody, która ma zostać wywołana,
    • margs_ - są to podane w formie json-a argumenty dla metody,
    • dscrpt - czyli opis, co dana metoda robi, czym więcej informacji dodasz tym później będzie łatwiej się połapać przy większej ilości wpisów,
    • usr_id - Identyfikator użytkownika, najczęściej wprowadzona wartość NULL,
    • ent_id - Id podmiotu,
    • is_del - czy ten wpis jest usunięty, należy wpisywać w formie boolean (false, true)

Jak napisać klasę

Jak już wcześniej mówiliśmy, w tabeli zapisujemy miejsce przechowywania metody oraz namespace z nazwą klasy.

W klasie musimy utworzyć metodę, która odpowiada podanej nazwie z kolumny meth__ do której możemy przekazać parametry z kolumny margs_,

Przykład Klasy

<?php

class CountUsersCron {

    private $logger;

  public function execute($params) {
     if (!is_array($params)) {
        $params = unserialize($params);
     }
     
     $db = PgManager::getInstance();

     $countUserLogIn = $db->select('users_status', 'count(*) as NumberUserLogin', "lastse > '".date('Y-m-d')."'", false, PGSQL_ASSOC);
     if (!isset($countUserLogIn[0])) {
        return FALSE;
     }
     $this->logMessage(sprintf(Translator::translate('Ilość zalogowanych użytkowników to %s'), $countUserLogIn[0]['NumberUserLogin']));
     
     return TRUE;
  }
  
  private function logMessage($message) {
    if ($this->logger) {
        $this->logger->write($message);
    }
  }
}

Przykład skryptu:

CountUsersCron.inc

Dodanie przykładowej klasy do tabeli cronTab poprzez instert-a

INSERT INTO crontab (every_, hour__, min___, dom___,mon___,dow___, path__,class_, cargs_, meth__, margs_, dscrpt, usr_id, ent_id,is_del )
VALUES      ('day',
             20,
             0,
             NULL,
             NULL,
             '1,2,3,4,5',
             './classes/CronRunner/CountUsersCron.inc',
             'CountUsersCron',
             NULL,
             'execute',
             '',
             'W każdy dzień o 20',
             NULL,
             {ent_id},
             FALSE
             )

Czy da się dodać joba dla crona przez system ? Otóż tak!

Wystarczy by w metodzie tworzącej (ang. create) dialog, utworzyć obiekt CronPanelDialog, odpowiednio go ustawić i nazwać

a następnie na metodzie zapisy (ang. save), ustawić joba poprzez metode setJob, przekazać odpowiednie parametry (szczegóły poniżej) a następnie wywołać metodę save.

  1. Parametry dla metody setJob, wymagane: path, path, class, cArgs, method. Nie wymagane (domyślnie wartość NULL): mArgs, dscrpt